问题描述
我是 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
并一次发送多个作业对我来说非常重要。例如,5 个相等的工作与 -o 1
然后 5 个与 -0 2
等等。我也希望能够以这种方式修改 -r
和 -ode
。问题是,如果不使用变量,我真的不知道该怎么做。
拜托,如果有人能告诉我如何以这种方式自动化脚本将是一个巨大的帮助。
解决方法
使用 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 和引用。更喜欢使用小写变量。壳中展开的研究顺序。
,如果您有很多静态参数和很多动态参数,另一种选择是重构为一个函数,在该函数中您对不变的部分进行硬编码,并插入发生变化的部分。
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
不是很熟悉;如果您不传入脚本名称,我假设它接受标准输入上的脚本。如果没有,也许您必须将此处的文档存储在临时文件,提交,删除临时文件。)