【问题标题】:How to use variables on qsub?如何在 qsub 上使用变量?
【发布时间】:2021-07-28 10:19:47
【问题描述】:

我是 qsub 的新手,我正在尝试弄清楚如何以最佳方式使用任务队列。我有这个运行良好的脚本:

#!bin/bash

##PBS -V  # Export all environment variables from the qsub command environment to the batch job.
#PBS -N run
#PBS -q normal.q 
#PBS -e archivo.err
#PBS -o archivo.out
#PBS -pe mpirun 8
#PBS -d ~/ # Working directory (PBS_O_WORKDIR)
#PBS -l nodes=1:ppn=8    

~/brinicle/step-2/onephase_3/./main.x --mesh ~/brinicle/step-2/onephase_3/results/mesh.msh -Rmin 0 -Rmax 10 -Zmin 0 -Zmax 10 -o 2 -r 2 -T_f -10 -a_l 7.8 -a_s 70.8 -dt 0.01 -t_f 1 -v_s 10 -ode 12 -reltol 0.00001 -abstol 0.00001

如您所见,问题在于命令行非常庞大且难以从命令 shell 进行编辑。我想把它分成变量,比如

#MESH="--mesh ~/brinicle/step-2/onephase_3/results/mesh.msh"
#EXE="~/brinicle/step-2/onephase_3/./main.x"
.
.
.
$EXE $MESH $PARAMETERS

还有其他参数。

但是当我这样做时,程序没有运行,并说有一个非法变量或该变量未定义。此外,轻松更改参数-o-r-ode 并一次发送多个作业对我来说非常重要。例如,-o 1 的 5 个相等的工作,然后是 -0 2 的 5 个,依此类推。我也希望能够以这种方式修改-r-ode。问题是不使用变量我真的不知道该怎么做。

拜托,如果有人能告诉我如何以这种方式自动化脚本,那将是一个巨大的帮助。

【问题讨论】:

标签: bash variables sh qsub


【解决方案1】:

使用 bash 数组。

exe=(~/brinicle/step-2/onephase_3/./main.x)
mesh=(--mesh ~/brinicle/step-2/onephase_3/results/mesh.msh)
parms=(
    -Rmin 0
    -Rmax 10
    -Zmin 0
    -Zmax 10
    . etc.
)
"${exe[@]}" "${mesh[@]}" "${parms[@]}"

研究 bash 数组以及如何在 shell 中使用 then 和引用。更喜欢使用小写变量。 shell中展开的研究顺序。

【讨论】:

  • 我绑了这个,上面写着:Badly place ()'s.
  • one after the other in the same node? 不知道,我从未使用过 qsub。 this: Badly placed ()'s 很可能您是在 sh 下执行脚本,而不是 bash。提供的代码works here
  • sh 也不会产生该消息;它来自cshtcsh
【解决方案2】:

如果您有大量静态参数和大量动态参数,另一种方法是重构为一个函数,您可以在其中硬编码不变的部分,并插入发生变化的部分。

qrunmesh () {
    qsub <<:
#!bin/bash

##PBS -V  # Export all environment variables from the qsub command environment to the batch job.
#PBS -N run
#PBS -q normal.q 
#PBS -e archivo.err
#PBS -o archivo.out
#PBS -pe mpirun 8
#PBS -d ~/ # Working directory (PBS_O_WORKDIR)
#PBS -l nodes=1:ppn=8

"$1" --mesh "$2" -Rmin 0 -Rmax 10 -Zmin 0 -Zmax 10 \
     -o "$3" -r "$4" -T_f -10 -a_l 7.8 -a_s 70.8 \
     -dt 0.01 -t_f 1 -v_s 10 -ode "$5" \
     -reltol 0.00001 -abstol 0.00001
:
}

for o in 1 2 3; do
  for r in 5 10 15; do
    for x in onephase_3 onephase_2 twophase_3; do
      for ode in 12 13 15; do
        for mesh in onephase_3 otherphase_2; do
           qrunmesh "$x" "$mesh" "$o" "$r" "$ode"
        done
      done
    done
  done
done

(我对qsub 不是很熟悉;如果您不传入脚本名称,我假设它接受标准输入上的脚本。如果没有,也许您必须将此处的文档存储在临时文件中,提交,然后删除临时文件。)

【讨论】:

  • 非常感谢您的回答。它对我有很大帮助。你知道这是否会在同一个节点中一个接一个地创建一个任务队列吗?或者任务将在所有节点之间平均分配?
  • 我对此一无所知;我希望它可以在不同的节点上运行,但我想这也取决于队列配置等。自从我使用 qsub 已经很多年了。
  • 我绑了这个,上面写着:Badly place ()'s.
  • 在哪里试过?这个函数定义语法应该可以移植到早期的 Bourne shell。
  • 错误消息似乎来自tcsh,这与您在问题中标记的两个shell都不兼容。
猜你喜欢
  • 2014-12-27
  • 1970-01-01
  • 2013-07-14
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多