如何编写脚本来检查错误作业并自动重新提交?

如何编写脚本来检查错误作业并自动重新提交?

我是一名博士生,在网格中运行工作(随时有约 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

相关内容