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.