
Я аспирант, запускающий задания в сетке (~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
Вы можете сохранить этот скрипт в/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