いくつかのqsubジョブを開始するバッチスクリプトがあり、それらがすべて完了したときにトラップする必要があります。
同時に実行したいので、-syncオプションを使用したくありません。各ジョブには、コマンドラインパラメーターの異なるセットがあります。
すべてのジョブが完了するまでスクリプトを待機させ、その後で何かを行う必要があります。スリープ機能を使いたくない特定のファイルが30秒ごとに生成されているかどうかを確認します。これはリソースの浪費であるためです。
Torqueにはいくつかのオプションがありますが、SGEを実行しています。
これを実装する方法についてのアイデアはありますか?
どうもありがとう。別のスレッドを見つけました リンク
応答があった
すべてのジョブが完了するまで、待機を使用して実行を停止できます。特定のIDを待機している場合は、すべての終了ステータスおよびその他の実行中の統計(所要時間、その時点で実行されたジョブの数など)を収集することもできます。
しかし、何らかの値をポーリングせずに使用する方法がわかりません。 bashトラップを使用できますが、qsubを使用するとどうなりますか?
-Nオプションを使用して任意の名前(job1、job2など)を付けて、qsubジョブを起動します。
qsub -N job1 -cwd ./job1_script
qsub -N job2 -cwd ./job2_script
qsub -N job3 -cwd ./job3_script
スクリプトを起動し、job1、job2、job3という名前のジョブが開始されるまで待機するように指示します。
qsub -hold_jid job1,job2,job3 -cwd ./results_script
別の代替手段( here から)は次のとおりです。
FIRST=$(qsub job1.pbs)
echo $FIRST
SECOND=$(qsub -W depend=afterany:$FIRST job2.pbs)
echo $SECOND
THIRD=$(qsub -W depend=afterany:$SECOND job3.pbs)
echo $THIRD
洞察は、qsubがjobidを返し、これは通常、標準出力にダンプされるということです。代わりに、変数($FIRST
、$SECOND
、$THIRD
)および-W depend=afterany:[JOBIDs]
ジョブをエンキューするときにフラグを立てて、デキューされるときの依存関係構造を制御します。
すべてのジョブの名前に共通のパターンがある場合、ジョブを送信するときにそのパターンを提供できます。 https://linux.die.net/man/1/sge_types は、使用できるパターンを示します。例:
-hold_jid "job_name_pattern*"
qsub -hold_jid job1,job2,job3 -cwd ./myscript
これはbashで機能しますが、アイデアは移植可能である必要があります。 -terse
を使用して、待機するジョブIDを含む文字列を作成しやすくします。次に、-hold_jid
を使用して前のジョブと-sync y
を待機するダミージョブを送信し、qsubが(したがってすべての前提条件が)終了するまで戻らないようにします。
# example where each of three jobs just sleeps for some time:
job_ids=$(qsub -terse -b y sleep 10)
job_ids=job_ids,$(qsub -terse -b y sleep 20)
job_ids=job_ids,$(qsub -terse -b y sleep 30)
qsub -hold_jid ${job_ids} -sync y -b y echo "DONE"
-terse
オプションにより、qsubの出力はジョブIDになります-hold_jid
オプション(他の回答で述べたように)は、指定されたジョブIDでジョブを待機させます-sync y
オプション(OPによって参照)は、サブミットされたジョブが終了するまで戻らないようにqsubに要求します-b y
は、コマンドがスクリプトファイルへのパスではないことを指定します(たとえば、sleep 30
をコマンドとして使用しています)詳細については manページ をご覧ください。
処理したいファイルが150個あり、毎回実行できるファイルが15個だけで、もう一方がキューに保持されている場合は、次のように設定できます。
# split my list files in a junk of small list having 10 file each
awk 'NR%10==1 {x="F"++i;}{ print > "list_part"x".txt" }' list.txt
各list_part * .txtの最初が2番目のジョブを保持するように、すべてのジョブをqsub .... 2番目のジョブが3番目のジョブを保持する.....
for list in $( ls list_part*.txt ) ; do
PREV_JOB=$(qsub start.sh) # create a dummy script start.sh just for starting
for file in $(cat $list ) ; do
NEXT_JOB=$(qsub -v file=$file -W depend=afterany:$PREV_JOB myscript.sh )
PREV_JOB=$NEXT_JOB
done
done
これは、myscript.shに多数のファイルを移動またはダウンロードする必要がある手順、またはクラスターLANで激しいトラフィックを作成する手順がある場合に便利です。
もっと柔軟性が必要だったので、この目的や他の目的のためにPythonモジュールを作成しました here 。このモジュールは、デモ用のスクリプト(python qsub.py
)として直接実行できます。
使用法:
$ git clone https://github.com/stevekm/util.git
$ cd util
$ python
Python 2.7.3 (default, Mar 29 2013, 16:50:34)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import qsub
>>> job = qsub.submit(command = 'echo foo; sleep 60', print_verbose = True)
qsub command is:
qsub -j y -N "python" -o :"/home/util/" -e :"/home/util/" <<E0F
set -x
echo foo; sleep 60
set +x
E0F
>>> qsub.monitor_jobs(jobs = [job], print_verbose = True)
Monitoring jobs for completion. Number of jobs in queue: 1
Number of jobs in queue: 0
No jobs remaining in the job queue
([Job(id = 4112505, name = python, log_dir = None)], [])
Python 2.7およびSGEを使用して設計されているため、システムが実行されます。必要な非標準のPythonライブラリは、含まれるtools.py
およびlog.py
モジュール、および sh.py (含まれる)のみです
純粋にbash
にとどまることを望む場合はそれほど有用ではありませんが、qsub
ジョブを待つ必要がある場合は、Python代わりに。