带参数的多个命令:如何使用逻辑或?

带参数的多个命令:如何使用逻辑或?

我们有两个命令

    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尝试。

相关内容