私は、グリッド(常に最大1,500のタスク)でタスクを実行している博士課程の学生です。一部のジョブはエラー状態になり、再送信する必要があります。ローカルコンピュータの端末でエラーが発生したタスクを表示するコマンドは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
このスクリプトを次の場所に保存できます。/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