Como reiniciar o script python após um segundo de descida usando o UPSTART?

2

Estou executando meu script Python usando o recurso upstart do Ubuntu para que, se por qualquer motivo meu script Python morrer ou for morto, ele possa ser reiniciado automaticamente e tudo esteja funcionando bem -

Então eu decidi usar o recurso UPSTART do Ubuntu para reiniciar o script Python automaticamente.

Depois de criar o arquivo testing.conf como este em /etc/init/testing.conf -

start on runlevel [2345]
stop on runlevel [016]

chdir /tekooz
exec python testing.py
respawn

Corri abaixo do comando sudo para iniciá-lo e vejo esse processo sendo executado usando ps ax e meu script python também está funcionando bem.

root@bx13:/tekooz# sudo start testing
testing start/running, process 27794

Agora, se eu matar o PID do processo acima, ele será reiniciado automaticamente dentro de alguns milissegundos ou microssegundos.

Existe alguma possibilidade de reiniciar meu script python após 1 segundo se ele caiu ou foi morto? Não quero reiniciar imediatamente.

    
por arsenal 25.01.2014 / 18:05

4 respostas

1

Isto é completamente não testado, mas é muito complexo para caber em um comentário, então esperamos que funcione.

Você pode adicionar uma sub-rotina post-stop , que fará o que quiser. Algo como:

post-stop script
  [ "$RESULT" == "failed" ] && sleep 1
end script

(há também um $EXIT_STATUS que você pode usar)

Para documentação, veja as seções do livro de receitas do pós-stop e environment variables .

O livro de culinária ainda tem uma seção sobre " o reaparecimento de atraso de um trabalho " , mas acho que a documentação pode estar incorreta. Ele diz que só atrasará com um código de saída diferente de zero, mas não há nada verificando o código de saída em seu exemplo, então ele seria executado incondicionalmente, o que não é o que você deseja.

    
por 25.01.2014 / 21:26
1

Você pode usar o próximo script de pós-parada para dormir somente antes do respawn job (sem dormir apenas quando 'stop' ou 'restart'):

post-stop script
  # Change value of STIME to your number of seconds:
  STIME=15
  initctl status $UPSTART_JOB |grep 'start/post-stop' >/dev/null && ( echo -n 'date'; echo ": Going to sleep of $STIME seconds before respawn..."; sleep $STIME ) || true
end script

Funciona corretamente para mim.

    
por 09.09.2014 / 16:29
0

Você precisará adicionar uma linha:

post-stop exec sleep 1

Isso, infelizmente, faz com que a ação de parada demore mais um segundo, mas é a única solução (a variável RESULT é apenas para o evento, não para as seções exec; não estará disponível como mostra Patrick).

Edit: ooh ooh eu tenho algo. Você pode criar um novo trabalho, digamos, test-wait-respawn, com o seguinte conteúdo para obtê-lo somente quando o trabalho tiver falhado:

start on stopping testing RESULT=failed

task

exec sleep 1
    
por 03.06.2014 / 04:56
0

Uma boa documentação para iniciantes em ubuntu.com: Atrasar o respawn de um trabalho

respawn
exec mydaemon
post-stop exec sleep 1
    
por 09.09.2014 / 16:56