エラージョブをチェックして自動的に再送信するためのスクリプトを記述するにはどうすればよいですか?

エラージョブをチェックして自動的に再送信するためのスクリプトを記述するにはどうすればよいですか?

私はグリッドでジョブを実行している博士課程の学生です (常時約 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

関連情報