Как написать скрипт для проверки заданий на наличие ошибок и автоматической повторной отправки?

Как написать скрипт для проверки заданий на наличие ошибок и автоматической повторной отправки?

Я аспирант, запускающий задания в сетке (~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

Связанный контент