Come posso eseguire uno script Python in background e riavviarlo dopo un arresto anomalo?


10

Ho uno script Python molto semplice che mi piacerebbe essere sempre in esecuzione sul mio server Ubuntu 12.04. Ho pensato di usare upstart + monit. Il problema è che quegli strumenti sembrano piuttosto complicati per un semplice mortale come me, e non riesco a trovare un semplice esempio sul web.

Upstart + monit è eccessivo? Qualcuno conosce un'alternativa più semplice o un buon tutorial per upstart + monit? Se voglio solo essere sicuro che lo script sia sempre in esecuzione, è necessario il monit?


Per riferimento, la stessa domanda esatta è stata posta qui: superuser.com/q/461546/786969
PHPirate

Risposte:


16

Il modo più semplice per farlo è inserire questo in /etc/init/something.conf:

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

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

Respawn avvierà il backup se viene ucciso o esce da zero (come un'eccezione non rilevata). Questo funzionerà risalendo a Ubuntu 10.04.

Se hai 12.04 puoi avere più fantasia. Quanto sopra eseguirà il tuo script come root. In 12.04 è possibile aggiungere setuid / setgid:

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

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

Se lo script viene chiuso quando non è disponibile alcuna rete e si prevede di eseguirlo su una connessione di rete instabile, è necessario correggerlo e farlo rimanere in vita / riprovare. Ma se non è possibile, potrebbe essere necessario avviarlo manualmente ogni volta che viene visualizzato un dispositivo di rete. Quindi puoi /etc/network/if-up.d/yourscriptinserirlo in (rendilo eseguibile con chmod + x)

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

Dove yourscript è solo qualcosa di arbitrario e unico per questo particolare script, e "qualcosa" è uguale al nome del lavoro (come quello /etc/init/something.confsuggerito in precedenza).


Si ! Quindi questo sta usando upstartgiusto? Questo significa che lo script verrà avviato anche all'avvio (il che sarebbe fantastico!)? Ed respawnè abbastanza per non doverlo configurare monit?
sebpiq,

Sì, "start on runlevel [2345]" indica nel momento in cui il sistema entra in "modalità multiutente". A lungo termine è in atto un piano per sostituire il vecchio "runlevel" univoco con cose come "start on start-services-network" e "stop on stop-services-services" in modo che leggano in modo più logico.
SpamapS

Eccezionale ! Grazie mille è esattamente quello di cui avevo bisogno.
sebpiq,

2

L'approccio usuale dei vecchi tempi era quello di scrivere un file contenente un timestamp o l'id di processo su /tmp e quindi verificare se questo id di processo era ancora in esecuzione o rispettosamente se il timestamp era ancora recente.

Inoltre potresti fare un semplice while [ 1 ]; do phyton-script.ph; done che riavvierebbe lo script nel caso in cui ritorni.

Per ulteriori possibilità, ti preghiamo di fornire maggiori informazioni sul tuo script. Soprattutto sul motivo per cui ti aspetti che esca o si blocchi improvvisamente.


lo script elimina solo i tweet da Twitter utilizzando un'API di streaming. Quindi in pratica c'è un ciclo infinito in attesa che vengano inviati i tweet, eseguendo un po 'di codice e tornando in attesa. Voglio solo che questo funzioni senza preoccuparsi ... se c'è un bug che si arresta in modo
anomalo

Una risposta simile alla tua (che ho accettato): superuser.com/questions/461546/…
sebpiq

Anche un cron-job per verificare se lo script è ancora in esecuzione potrebbe essere una buona idea.
con-f-use
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.