7

サーバーに送信したすべてのジョブが完了したら、スクリプトを実行したいと思います。

たとえば、私は送信します

ssh server "for i in config*; do qsub ./run 1 $i; done"

そして、開始されたジョブのリストを取得します。すべてが完了したら、サーバー上で別のスクリプトを自動的に開始して、これらのジョブからの出力を処理したいと思います。

次のエレガントでない解決策を回避するのに役立つアドバイスをいただければ幸いです。

上記の呼び出しからの1000個のジョブIDのそれぞれを別のファイルに保存すると、実行中のジョブの現在のリスト、つまり次の呼び出しからの出力に対して、各ファイルの内容を確認できます。

ssh qstat

30分ごとにチェックするだけですが、もっと良い方法があると思います。

4

3 に答える 3

8

使用しているジョブ スケジューラとバージョンによって少し異なりますが、結果処理をジョブと同じキューでも実行できる場合は、別の方法も使用できます。

最近のバージョンの Torque (およびグリッド エンジンなど) で関連する多数のジョブを管理する非常に便利な方法の 1 つは、個々のジョブをジョブ配列として起動することです ( http://docs.adaptivecomputing.com/torqueを参照)。 /4-1-4/Content/topics/commands/qsub.htm#-t )。これには、個々の実行を何らかの方法で数値にマッピングする必要がありますが、これは便利な場合とそうでない場合があります。しかし、仕事のためにそれを行うことができれば、仕事の管理が大幅に簡素化されます。それらすべてを 1 行で qsub できます。また、それらすべてを一度に qdel または qhold できます (ただし、ジョブを個別に処理する機能があります)。

これを行うと、配列内のすべてのジョブが完了した場合にのみ実行されるジョブの配列に依存する分析ジョブを送信できます: (参照: http://docs.adaptivecomputing.com/torque /4-1-4/Content/topics/commands/qsub.htm#dependencyExamples )。ジョブの送信は次のようになります。

qsub analyze.sh -W depend=afterokarray:427[]

ここで、analyze.sh には分析を行うスクリプトがあり、427 は起動したジョブの配列のジョブ ID になります。([] は、すべてが完了した後にのみ実行することを意味します)。他のスケジューラ (SGE/OGE など) では構文が異なりますが、考え方は同じです。

これを正しく行うには多少の手間がかかりますが、確かに Tristan のアプローチには単純であり、どのスケジューラーでも動作するという利点があります。しかし、これをたくさん行う場合は、この状況でジョブ配列を使用することを学ぶことは、時間の価値があるかもしれません。

于 2010-10-12T02:46:20.527 に答える
6

あなたが考えるかもしれないことは、各ジョブスクリプトが のような専用フォルダー内のファイル名に触れるだけ$i.jobdoneで、マスタースクリプトでls *.jobdone | wc -l、適切な数のジョブが実行されたかどうかをテストするために単純に使用できることです。

于 2010-10-07T22:47:36.740 に答える
1

すべてのジョブが完了するまで、waitを使用して実行を停止できます。特定の ID を待って循環する場合は、すべての終了ステータスとその他の実行中の統計情報 (かかった時間、その時点で実行されたジョブの数など) を収集することもできます。

待機と収集 (実行可能ファイルをアップロードして実行する権限がある場合) を行う小さな C プログラムを作成しますが、柔軟性は劣りますが、ほぼ同じ目的で組み込みの bash待機を簡単に使用できます。

編集:小さな例。

#!/bin/bash

...
waitfor=''

for i in tasks; do
    task &
    waitfor="$waitfor $!"
done

wait $waitfor
...

このスクリプトをバックグラウンドで実行しても問題はありません。待ち行列の後に来るものはすべて、ジョブが終了したときに実行されます。

于 2010-10-08T08:36:18.397 に答える