QSUBジョブがサーバーで終了したときにBASHスクリプトを自動的に実行する方法は?

StackOverflow https://stackoverflow.com/questions/3886168

質問

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

たとえば、送信します

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

そして、私は始められた仕事のリストを取り戻します。すべてが完了したら、これらのジョブからの出力を処理するために、サーバー上の別のスクリプトを自動的に起動したいと思います。

以下の解決策を避けるのに役立つアドバイスに感謝します。

上記のコールから1000個のジョブIDを別のファイルに保存すると、各ファイルの内容を実行中のジョブの現在のリスト、つまり通話から次のように確認できます。

ssh qstat

30分ごとに確認する必要がありますが、より良い方法があると想像します。

役に立ちましたか?

解決

使用しているジョブスケジューラとどのバージョンに依存しますが、結果処理もジョブと同じキューで実行できる場合は、取ることができる別のアプローチがあります。

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

これを行うと、アレイ内のすべてのジョブが完了した後にのみ実行されるジョブの配列に依存している分析ジョブを提出できます。(cf。 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など)で異なりますが、アイデアは同じです。

これを正しくするには、いくつかのやり方が必要になり、トリスタンのアプローチにはシンプルであるという利点があり、スケジューラを使用するという利点があります。しかし、あなたがこれをたくさんしているなら、この状況でジョブアレイを使用することを学ぶことはあなたの時間の価値があるかもしれません。

他のヒント

あなたが考慮するかもしれないことは、各ジョブスクリプトを持っていることです。 $i.jobdone, 、そしてあなたのマスタースクリプトでは、あなたは単に使用することができます ls *.jobdone | wc -l 適切な数のジョブをテストします。

使用できます 待つ すべての仕事が完了するまで実行を停止します。特定のIDを待っている場合、すべての出口ステータスやその他の実行中の統計を収集することもできます(時間がかかる時間、その時点で行われたジョブの数)。

待機と収集を行うための小さなCプログラムを書きます(実行可能ファイルをアップロードして実行する許可がある場合)が、Bashを簡単に使用できます 待つ 柔軟性が低いにもかかわらず、ほぼ同じ目的で組み込まれています。

編集: :小さな例。

#!/bin/bash

...
waitfor=''

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

wait $waitfor
...

このスクリプトをバックグラウンドで実行した場合、それはあなたを悩ませません。 待つ 仕事が終わったときにラインが実行されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top