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