2つのコマンドがあります
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;
最初のコマンドが失敗した場合は、論理ORを使用して2番目のコマンドを実行したいと思います。
私は努力しました:
{ sbatch ... ; } || \
{ qsub ... ; }
編集:より具体的に説明してください。
2つのクラスタがあります。最初のSLURMと2番目のSGEで実行します。 SLURMとSGEに同じスクリプトを使用したいです。だから私は論理ORを使ってこれを解決しようとしました。最初のコマンドが失敗すると(システムが存在せず、コマンドがわからないため)、2番目のコマンドが実行されます。
実装する
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
実行は2つのコマンド間の終了状態に基づいています。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
しかし、これはいいえmakeは、qsub
実行中のスクリプトの終了script.sh
ステータスによって異なりますsbatch
。
sbatch
スクリプトと同じ終了状態で終了するには、対応するオプションをscript.sh
使用する必要があります。sbatch
-W
--wait
-W
、--wait
送信されたジョブが終了するまで終了しないでください。コマンドの終了コードは、sbatch
送信されたジョブの終了コードと同じです。通常のシャットダウン以外のシグナルによりジョブが終了すると、終了コードは 1 に設定されます。ジョブ配列の場合、記録された終了コードは、ジョブ配列内のすべてのジョブに対して最も高い値になります。
つまり、
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
これは、シェルに組み込まれているユーティリティを使用して見つけることができるかどうかをcommand
テストします。sbatch
テストが成功した場合はsbatch
実行し、そうでない場合はqsub
試してください。