如何編寫腳本來檢查錯誤作業並自動重新提交?

如何編寫腳本來檢查錯誤作業並自動重新提交?

我是博士生,在網格中運行作業(隨時有約 1500 個作業)。有些作業進入錯誤狀態,需要重新提交。查看錯誤作業的命令(從我的本機計算機,在終端機中)是alien_ps -E這樣的:

   mhaque -762153733  __  EV                                   
   mhaque -762160371  __  EV                                   
   mhaque -762376874  __  EV 

.. 很快..

要重新提交作業,我需要使用alien_resubmit $jobid(在我的筆記型電腦終端視窗中)。所以我使用以下 shell 命令:

alien_ps -E | grep 'E' | sed 's/-//' | awk '{print "alien_resubmit " $2}' 

這給了我:

alien_resubmit 762153733
alien_resubmit 762160371
alien_resubmit 762376874

.. 很快..

然後我將此輸出複製並貼上到我的終端,然後重新提交所有這些錯誤作業。這是真正的問題:我不知道作業何時會進入錯誤狀態。因此,我需要手動登入我的筆記型電腦,檢查是否有任何作業進入錯誤狀態,然後重新提交(在 24 小時內,否則網格會終止該作業)。因此,我想編寫一個簡單的 shell 腳本testmyjob.sh,該腳本將循環此命令 5 分鐘的時間間隔:

alien_ps -E | grep 'E' | sed 's/-//' | awk '{print $2}'

看看有沒有jobid。如果沒有作業出錯,那麼它將在 5 分鐘後再次進行檢查(並繼續執行一定的次數,例如在我執行 shell 後 200 次)。如果發現錯誤jobid,則會執行命令:

alien_resubmit jobid         (..for all error jobs..).

提交錯誤作業後,它將再次恢復每 5 分鐘間隔檢查錯誤作業。

因此,我只需./testmyjob.sh從我的筆記型電腦/桌上型電腦終端機運行,它就會在後台繼續工作,使我不必自己進行檢查。我不擅長 shell 腳本編寫。所以請幫我寫一個簡單的 shell 腳本來完成這項工作。確切地說,這是框圖:(請原諒我的 shell 知識)

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

相關內容