Como faço para executar um script Python em segundo plano e reiniciá-lo após uma falha?

8

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

O exagero é + overstill? Alguém sabe uma alternativa mais simples, ou um bom tutorial para iniciante + monit? Se eu só quiser ter certeza de que o script está sempre em execução, é necessário monit?

    
por sebpiq 14.08.2012 / 16:32

2 respostas

15

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 Respawn iniciará o backup se for eliminado ou sair de zero (como uma exceção não identificada). Isso funcionará no Ubuntu 10.04.

Se você tem 12.04 você pode ficar mais chique. O acima irá executar o seu script como root. Em 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, bem, você deve corrigir isso e apenas mantê-lo ativo / tente novamente. Mas se você não puder, talvez seja necessário iniciá-lo manualmente sempre que um dispositivo de rede for ativado. Então você pode colocar isso em /etc/network/if-up.d/yourscript (torná-lo executável com chmod + x)

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

Onde o seu título é apenas algo arbitrário e exclusivo para este script específico, e "algo" é o mesmo que o nome do trabalho (como o /etc/init/something.conf sugerido anteriormente).

    
por SpamapS 16.08.2012 / 06:16
2

A abordagem usual dos dias antigos era escrever um arquivo contendo um registro de data / hora ou o ID do processo para /tmp e, em seguida, verificar se esse ID do processo ainda estava em execução ou respeitosamente se o registro de data e hora ainda era recente.

Além disso, você pode fazer um simples while [ 1 ]; do phyton-script.ph; done , que irá reiniciar o script caso ele retorne.

Para mais possibilidades, por favor, forneça mais informações sobre o seu roteiro. Especialmente porque você espera que ele saia ou quebre inesperadamente.

    
por con-f-use 14.08.2012 / 16:46