¿Cómo escribir un script para verificar trabajos con errores y reenviarlos automáticamente?

¿Cómo escribir un script para verificar trabajos con errores y reenviarlos automáticamente?

Soy un estudiante de doctorado que ejecuta trabajos en una cuadrícula (~1500 trabajos en cualquier momento). Algunos de los trabajos entran en estado de error y es necesario volver a enviarlos. El comando para ver los trabajos de error (desde mi máquina local, en una terminal) es alien_ps -Eel que me da esto:

   mhaque -762153733  __  EV                                   
   mhaque -762160371  __  EV                                   
   mhaque -762376874  __  EV 

.. pronto..

Para volver a enviar los trabajos, necesito usar alien_resubmit $jobid(en la ventana de terminal de mi computadora portátil). Entonces uso el siguiente comando de shell:

alien_ps -E | grep 'E' | sed 's/-//' | awk '{print "alien_resubmit " $2}' 

lo que me da:

alien_resubmit 762153733
alien_resubmit 762160371
alien_resubmit 762376874

.. pronto..

Luego copio y pego esta salida en mi terminal y luego vuelvo a enviar todos esos trabajos de error. Aquí está el verdadero problema: no sé cuándo los trabajos entrarán en estado de error. Por lo tanto, necesito iniciar sesión manualmente en mi computadora portátil y verificar si algún trabajo entró en estado de error y luego volver a enviarlo (dentro de las 24 horas o la red cancelará el trabajo). Entonces, me gustaría escribir un script de shell simple testmyjob.shque repetirá este comando en intervalos de 5 minutos:

alien_ps -E | grep 'E' | sed 's/-//' | awk '{print $2}'

y ver si hay alguno jobid. Si no hay ningún error en ningún trabajo, volverá a realizar la verificación después de 5 minutos (y seguirá haciéndolo una cantidad definida de veces, digamos, 200 veces después de ejecutar el shell). Si encuentra un error jobid, lo hará y ejecutará el comando:

alien_resubmit jobid         (..for all error jobs..).

Después de enviar los trabajos de error, nuevamente reanudará la verificación de trabajos de error para cada intervalo de 5 minutos.

Así que simplemente lo ejecutaré ./testmyjob.shdesde mi computadora portátil/terminal de escritorio y seguirá funcionando en segundo plano y me liberará de realizar la verificación yo solo. No soy bueno con los scripts de shell. Entonces, ayúdenme a escribir un script de shell simple que haga este trabajo. Para ser precisos, aquí está el diagrama de bloques: (perdón por mi conocimiento del 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

Tenga en cuenta que siempre hay varios trabajos en estado de error (consulte los ejemplos que di) y no sé cómo asignará los trabajos a una variable o creará una matriz. Cualquier tipo de ayuda con el guión es muy apreciada.

Respuesta1

Puede guardar este script en/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

Luego deberías configurar el script como ejecutable ejecutando este comando:

chmod a+x /usr/local/bin/resubmit_jobs

Luego agregue una entrada a su crontab. Simplemente escriba: crontab -ey agregue esas líneas:

[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

Si deseas ejecutar este script manualmente solo tienes que hacer:resubmit_jobs

Respuesta2

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

información relacionada