標準的なことは、それ自体を送信する runscript を作成することです。これをチェーニングと呼びます。必要最小限の bash の例として、次のスクリプトが/path/to/script.sh
あり、JOB_ID が特定の Torque セットアップを参照する変数を表しているとします (おそらくPBS_JOBID
?)
#!/bin/bash
#MSUB OPTIONS...
#(
#sleep 60 #for example
msub -l depend=${JOB_ID} /path/to/script.sh > /path/to/next_job.msub
#)&
[do hard work here: run your r script, etc.]
canceljob $(cat /path/to/next_job.msub)
ここで重要なのは、next_job
(依存関係によって) 現在のジョブが終了したときにのみ実行される新しいジョブを送信する行です (終了するか正常に終了するかに関係なく)。「大変な作業」のステップが終了すると、フォローアップ ジョブがキャンセルされます。しかし、「大変な作業」のステップが実時間 (またはその他の理由) によって中断された場合、canceljob
コマンドに到達することはなく、サブミットされたジョブが最終的に実行されます。
私は通常、提出物を括弧で囲み、少し寝てから&
(つまり、4、5、7 行目のコメントを外して) メイン スクリプトからそのプロセスを分離します。このようにして、「ハードワーク」に問題があり、最初の 1 分ほどで失敗した場合、そのプロセスは終了し、非常に短いが失敗したジョブの無限の連鎖が発生することはありません。