
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 -E
o 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.sh
que 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.sh
a 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 -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 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