Como escrever script para verificar trabalhos de erro e reenvio automático?

1

Eu sou um estudante de doutoramento executando trabalhos em uma grade (~ 1500 empregos a qualquer momento). Alguns dos trabalhos vão para o estado de erro que precisam ser reenviados. O comando para ver os trabalhos de erro (da minha máquina local, em um terminal) é alien_ps -E , o que me dá isto:

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

.. assim por diante ..

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}' 

que me dá:

alien_resubmit 762153733
alien_resubmit 762160371
alien_resubmit 762376874

.. assim por diante ..

Em seguida, copio e colo essa saída no meu terminal, que reenvia todos esses trabalhos de erro. Aqui está o verdadeiro problema: eu não sei quando os trabalhos irão para o estado de erro. Portanto, preciso fazer login manualmente no meu laptop e verificar se algum trabalho foi para o estado de erro e, em seguida, reenviá-lo (dentro de 24 horas ou a grade mata o trabalho).  Então, eu gostaria de escrever um script de shell simples testmyjob.sh que irá repetir este comando por intervalos de 5 minutos:

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

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

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

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

Então, só vou rodar ./testmyjob.sh do meu terminal de laptop / desktop e ele continuará trabalhando em segundo plano, e me aliviar de fazer a verificação sozinho. Eu não sou bom em scripts de shell. Então, por favor me ajude a escrever um script de shell simples que faça este trabalho. Para ser preciso, aqui está o diagrama de blocos: (perdoe meu conhecimento de 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

Por favor, note que há sempre vários trabalhos em estado de erro (veja os exemplos que eu dei) e eu não sei como você irá atribuir os trabalhos a uma variável ou fazer uma matriz?  Qualquer tipo de ajuda com script é muito apreciado.

    
por R. Haq 04.11.2016 / 00:18

2 respostas

2

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

Em seguida, você deve definir o script como executável executando este comando:

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

Adicione uma entrada ao seu crontab. Basta digitar: crontab -e e 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 criar: resubmit_jobs

    
por 04.11.2016 / 00:53
1
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
    
por 04.11.2016 / 00:24