Como executo um script Python em segundo plano e o reinicio após uma falha?

10

Eu tenho um script Python muito simples que eu gostaria de estar sempre executando no meu servidor Ubuntu 12.04. Pensei em usar o upstart + monit. O problema é que essas ferramentas parecem bastante complicadas para um mortal simples como eu, e não consigo encontrar um exemplo simples na web.

Upstart + monit é um exagero? Alguém conhece uma alternativa mais simples ou um bom tutorial para upstart + monit? Se eu apenas quero ter certeza de que o script está sempre em execução, o monit é obrigatório?

sebpiq
fonte
Para referência, exatamente a mesma pergunta foi feita aqui: superuser.com/q/461546/786969
PHPirate 28/03/19

Respostas:

16

A maneira mais simples de fazer isso é colocar isso em /etc/init/something.conf:

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

respawn
exec python /path/to/your/script.py

O reaparecimento iniciará novamente se for morto ou sair diferente de zero (como uma exceção não capturada). Isso funcionará desde o Ubuntu 10.04.

Se você tem 12.04, pode ficar mais chique. O acima irá executar seu script como root. Na versão 12.04, você pode adicionar setuid / setgid:

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

respawn
setuid nobody
setgid nogroup
exec python /path/to/your/python.py

Se o seu script sair quando não houver rede disponível e você planeja executá-lo em uma conexão de rede instável, conserte-o e mantenha-o vivo / tente novamente. Mas, se não puder, talvez seja necessário iniciá-lo manualmente sempre que um dispositivo de rede aparecer. Então você pode colocar isso em /etc/network/if-up.d/yourscript(torne-o executável com chmod + x)

#!/bin/sh
exec start wait-for-state WAITER=$IFACE-yourscript WAIT_FOR=something

Onde o seu script é apenas algo arbitrário e exclusivo para esse script específico, e "algo" é igual ao nome do trabalho (como o /etc/init/something.confsugerido anteriormente).

SpamapS
fonte
Sim ! Então, isso está usando upstartcerto? Isso significa que o script também será iniciado na inicialização (o que seria ótimo!)? E respawné suficiente para que você não precise configurar monit?
sebpiq
Sim, o 'start on runlevel [2345]' significa no momento em que o sistema entra no "modo multiusuário". A longo prazo, existe um plano para substituir o "nível de execução" muito antigo e unix por coisas como 'iniciar a inicialização de serviços de rede' e 'parar de interromper os serviços de rede', para que a leitura seja mais lógica.
SpamapS
Impressionante ! Muito obrigado, é exatamente o que eu precisava.
sebpiq
2

A abordagem usual desde os tempos antigos era gravar um arquivo contendo um registro de data e hora ou o ID do processo /tmpe, em seguida, verificar se esse ID de processo ainda estava em execução ou, respectivamente, se o registro de data e hora ainda era recente.

Você também pode fazer um simples while [ 1 ]; do phyton-script.ph; doneque reinicie o script, caso ele retorne.

Para mais possibilidades, forneça mais informações sobre seu script. Especialmente por que você espera que ele saia ou trava inesperadamente.

confundir
fonte
o script apenas retira os tweets de twitters usando uma API de streaming. Então, basicamente, há um loop infinito esperando que os tweets sejam enviados, executando algum código e voltando à espera. Eu só quero que isso seja correndo sem se preocupar ... se há um erro e ele trava, e assim por diante ...
sebpiq
Uma resposta semelhante à sua (que eu aceitei): superuser.com/questions/461546/…
sebpiq
Também um cron-job para verificar se o script ainda está em execução pode ser uma boa ideia.
con-f-use