我们有两个命令
sbatch -J $jobname -N 1 --array [1-10:1] \
script.sh param1 param2 param3 \
param4 param5 param6;
qsub -N $jobname -t 1-10:1 \
script.sh param1 param2 param3 \
param4 param5 param6;
如果第一个命令失败,我想使用逻辑或来执行第二个命令。
我已经尝试过:
{ sbatch ... ; } || \
{ qsub ... ; }
编辑:更具体一点。
有两个簇。在第一个 SLURM 上运行,在第二个 SGE 上运行。我想对 SLURM 和 SGE 使用相同的脚本。因此,我尝试通过使用逻辑或来解决此任务:如果第一个命令失败(因为系统不存在,命令未知),则执行第二个命令。
执行
sbatch -J $jobname -N 1 --array [1-10:1] \
script.sh param1 param2 param3 \
param4 param5 param6; ||
qsub -N $jobname -t 1-10:1 \
script.sh param1 param2 param3 \
param4 param5 param6;
产量
syntax error near unexpected token `||'
执行
{ sbatch ... ; } ||
{ qsub ... ; }
产量
sbatch: command not found
Your job-array 9982202.1-10:1
答案1
如您所示,qsub
根据退出状态执行,在两个命令之间:sbatch
||
sbatch -J "$jobname" -N 1 --array '[1-10:1]' \
script.sh param1 param2 param3 param4 param5 param6 ||
qsub -N "$jobname" -t '1-10:1' \
script.sh param1 param2 param3 param4 param5 param6
然而,这将不是makeqsub
取决于正在运行的脚本的退出script.sh
状态sbatch
。
要使sbatch
终止与您的脚本具有相同的退出状态script.sh
,您必须使用sbatch
它的-W
或--wait
选项:
-W
,--wait
在提交的作业终止之前不要退出。该命令的退出代码sbatch
将与提交作业的退出代码相同。如果作业由于信号而不是正常退出而终止,则退出代码将设置为 1。对于作业数组,记录的退出代码将是作业数组中任何任务的最高值。
IE,
sbatch -W -J "$jobname" -N 1 --array '[1-10:1]' \
script.sh param1 param2 param3 param4 param5 param6 ||
qsub -N "$jobname" -t '1-10:1' \
script.sh param1 param2 param3 param4 param5 param6
如果您只想执行该sbatch
命令(如果该命令可用),否则运行该qsub
命令,那么您可以使用
if command -v sbatch >/dev/null 2>&1; then
sbatch -J "$jobname" -N 1 --array '[1-10:1]' \
script.sh param1 param2 param3 param4 param5 param6
else
qsub -N "$jobname" -t '1-10:1' \
script.sh param1 param2 param3 param4 param5 param6
fi
这用 shell 内置command
实用程序测试是否sbatch
可以找到。如果测试成功,sbatch
则执行,否则qsub
尝试。