
私はグリッドでジョブを実行している博士課程の学生です (常時約 1500 ジョブ)。一部のジョブはエラー状態になり、再送信する必要があります。エラー ジョブを確認するコマンド (ローカル マシンのターミナルから) はalien_ps -E
次のようになります。
mhaque -762153733 __ EV
mhaque -762160371 __ EV
mhaque -762376874 __ EV
.. すぐ..
ジョブを再送信するには、alien_resubmit $jobid
(ラップトップのターミナル ウィンドウで) を使用する必要があります。そこで、次のシェル コマンドを使用します。
alien_ps -E | grep 'E' | sed 's/-//' | awk '{print "alien_resubmit " $2}'
つまり、次のようになります。
alien_resubmit 762153733
alien_resubmit 762160371
alien_resubmit 762376874
.. すぐ..
次に、この出力をコピーしてターミナルに貼り付け、すべてのエラー ジョブを再送信します。ここで問題となるのは、ジョブがいつエラー状態になるかがわからないことです。そのため、手動でラップトップにログインし、エラー状態になったジョブがあるかどうかを確認し、再送信する必要があります (24 時間以内に実行しないと、グリッドによってジョブが強制終了されます)。そこで、testmyjob.sh
このコマンドを 5 分間隔でループする簡単なシェル スクリプトを作成します。
alien_ps -E | grep 'E' | sed 's/-//' | awk '{print $2}'
そして、何かあるかどうかを確認しますjobid
。ジョブにエラーがない場合は、5 分後に再度チェックを実行します (シェルを実行した後、たとえば 200 回など、一定回数実行し続けます)。エラーが見つかった場合は、jobid
次のコマンドを実行します。
alien_resubmit jobid (..for all error jobs..).
エラー ジョブを送信した後、5 分間隔ごとにエラー ジョブのチェックが再開されます。
それで、ラップトップ/デスクトップ端末から実行する./testmyjob.sh
と、バックグラウンドで動作し続け、自分で確認する必要がなくなります。私はシェル スクリプトが得意ではありません。この作業を実行する簡単なシェル スクリプトの作成を手伝ってください。正確には、ブロック図は次のとおりです。(シェルの知識が不足しています)
try = 0
while(try<200) do
jobid=alien_ps -E | grep 'E' | sed 's/-//' | awk '{print $2}'
if(jobid is nonzero)
alien_resubmit jobid
wait_for_5min
try+ = 1;
end do
常にエラー状態のジョブが複数あることに注意してください (私が示した例を参照)。ジョブを 1 つの変数に割り当てる方法や配列を作成する方法がわかりません。スクリプトに関するどのような支援でも大歓迎です。
答え1
このスクリプトは以下に保存できます/usr/local/bin/resubmit_jobs
#!/bin/bash
for job in $(alien_ps -E | grep 'E' | awk '{print $2}' | sed 's/-//'); do
alien_resubmit $job
done
次に、次のコマンドを実行して、スクリプトを実行可能として設定する必要があります。
chmod a+x /usr/local/bin/resubmit_jobs
次に、crontab にエントリを追加します。次のように入力しcrontab -e
、次の行を追加します。
[email protected] # so you'll get the output of your cron jobs by mail
*/5 * * * * /usr/local/bin/resubmit_jobs # this add a cron jobs that will run your resubmit_jobs script every 5 minutes
このスクリプトを手動で実行したい場合は、次のようにします。resubmit_jobs
答え2
iterations=200
while [[ $iterations -gt 1 ]]; do
for job in $(alien_ps -E | grep 'E' | awk '{print $2}' | sed 's/-//'); do
alien_resubmit $job
done
sleep 300
iterations=$(($iterations-1))
done