
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 -E
el 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.sh
que 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.sh
desde 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 -e
y 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