
我是博士生,在網格中運行作業(隨時有約 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