Como escrever um script para verificar trabalhos com erros e reenviar automaticamente?

Como escrever um script para verificar trabalhos com erros e reenviar automaticamente?

Sou um estudante de doutorado executando trabalhos em uma grade (cerca de 1.500 empregos a qualquer momento). Alguns dos trabalhos vão para o estado de erro e precisam ser reenviados. O comando para ver os jobs com erro (da minha máquina local, em um terminal) é alien_ps -Eo que me dá o seguinte:

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

.. breve..

Para reenviar os trabalhos, preciso usar o alien_resubmit $jobid(na janela do terminal do meu laptop). Então eu uso o seguinte comando shell:

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

o que me dá:

alien_resubmit 762153733
alien_resubmit 762160371
alien_resubmit 762376874

.. breve..

Em seguida, copio e colo esta saída em meu terminal, que reenvia todos os trabalhos de erro. Aqui está o verdadeiro problema: não sei quando os trabalhos entrarão em estado de erro. Portanto, preciso fazer login manualmente no meu laptop e verificar se algum trabalho entrou em estado de erro e reenviá-lo (dentro de 24 horas ou a grade encerrará o trabalho). Então, eu gostaria de escrever um script de shell simples testmyjob.shque faça um loop neste comando em intervalos de 5 minutos:

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

e veja se há algum jobid. Se nenhum trabalho estiver com erro, ele fará a verificação novamente após 5 minutos (e continuará fazendo isso por um número definido de vezes, digamos, 200 vezes depois de executar o shell). Se encontrar um erro jobid, ele irá executar o comando:

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

Após enviar os trabalhos com erros, ele retomará novamente a verificação de trabalhos com erros a cada intervalo de 5 minutos.

Portanto, executarei ./testmyjob.sha partir do meu terminal de laptop/desktop e ele continuará funcionando em segundo plano, evitando que eu faça a verificação sozinho. Eu não sou bom em scripts de shell. Então, por favor, ajude-me a escrever um script de shell simples que faça esse trabalho. Para ser mais preciso, aqui está o diagrama de blocos: (desculpe meu conhecimento sobre 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

Observe que sempre há vários jobs em estado de erro (veja os exemplos que dei) e não sei como você vai atribuir os jobs a uma variável ou fazer um array? Qualquer tipo de ajuda com o script é muito apreciada.

Responder1

Você pode salvar este script em/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

Então você deve definir o script como executável executando este comando:

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

Em seguida, adicione uma entrada ao seu crontab. Basta digitar: crontab -ee adicionar essas linhas:

[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

Se você quiser executar este script manualmente, basta fazer:resubmit_jobs

Responder2

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

informação relacionada