0

一連の配列ジョブを SGE に送信する Perl スクリプトがあります。時間を節約するためにすべてのジョブを並行して実行し、すべてのジョブが完了するまでスクリプトを待機させてから、すべての SGE 出力ファイルからの情報を統合して最終出力を生成する次の処理ステップに進みたいと考えています。

すべてのジョブをバックグラウンドに送信してから待機するために、Parallel::ForkManager とループを使用します。

$fork_manager = new Parallel::ForkManager(@as); 
# @as: Max nb of processes to run simultaneously
for $a (@as) {
    $fork_manager->start and next; # Starts the child process
    system "qsub <qsub_options> ./script.plx";
    $fork_manager->finish; # Terminates the child process
}
$fork_manager->wait_all_children; 
<next processing step, local>

ただし、「待機」部分が機能するためには、qsub オプションに「-sync yes」を追加する必要がありました。しかし、これの「副作用」として、SGE は各配列ジョブの各タスクの終了コードを出力します。多くのジョブがあり、単一のタスクは軽いため、基本的に、これらすべての割り込みメッセージが原因でシェルが使用できなくなります。 qsub ジョブが実行されています。

これらのメッセージを取り除くにはどうすればよいですか? どちらかといえば、ジョブのqsubの終了コードをチェックすることに興味があります(次のステップの前にすべてがうまくいったことを確認できます)が、タスクごとに1つの終了コードではありません(とにかくオプション-eを介してタスクのエラーを記録します必要な場合に備えて)。

4

1 に答える 1

0

最も簡単な解決策は、qsub からの出力をどこかにリダイレクトすることです。

system("qsub <qsub options> ./script.plx >/dev/null 2>&1");

ただし、これにより、表示したいエラーがマスクされます。または、open() を使用してサブプロセスを開始し、その出力を読み取り、サブプロセスがエラーを生成した場合にのみ何かを出力することもできます。

ただし、別の解決策があります。-sync y なしで SGE にジョブを送信し、qsub が出力するときにジョブ ID を取得できます。次に、要約と結果収集のコードを後続のジョブに変換し、最初のジョブの完了に依存してサブミットします。この最終ジョブを -sync y でサブミットして、呼び出しスクリプトが終了するのを待つことができます。qsub man ページの -hold_jid のドキュメントを参照してください。

また、呼び出しスクリプトに次のジョブをいつサブミットするか (最大まで) を決定させるのではなく、SGE の -tc オプションを使用して同時ジョブの最大数を指定します (-tc はマニュアル ページにはありませんが、 qsub の -help 出力にあります)。もちろん、これは、-tc を使用するのに十分な新しいバージョンの SGE を使用するかどうかに依存します。

于 2012-05-24T04:25:29.113 に答える