2013-07-19 16 views
34

Ho scritto un modulo in Python e voglio che venga eseguito continuamente una volta avviato e che debba interromperlo quando devo aggiornare altri moduli. Probabilmente userò Monit per riavviarlo, se il modulo si è bloccato o non è in esecuzione altrimenti.Daemon vs Upstart per script python

Stavo passando attraverso diverse tecniche come Daemon, Upstart e molte altre.

Qual è il modo migliore per andare in modo che io utilizzi questo approccio attraverso i miei nuovi moduli per continuare a eseguirli per sempre?

risposta

67

Dalla tua menzione di Upstart supporrò che questa domanda riguardi un servizio eseguito su un server Ubuntu.

Su un server Ubuntu, un lavoro di avviamento è l'opzione più semplice e più conveniente per la creazione di un servizio sempre attivo che si avvia al momento giusto e può essere arrestato o ricaricato con comandi familiari.

Per creare un servizio di avviamento è necessario aggiungere un singolo file a /etc/init. Chiamato <service-name>.conf. Uno script di esempio si presenta così:

description "My chat server" 
author "[email protected]" 

start on runlevel [2345] 
stop on runlevel [!2345] 

env AN_ENVIRONMENTAL_VARIABLE=i-want-to-set 

respawn 

exec /srv/applications/chat.py 

Questo significa che ogni volta che si avvia la macchina inizierà il programma chat.py. Se muore per qualsiasi motivo, lo riavvierà. Non devi preoccuparti di duplicare il doppio o altrimenti demonizzare il tuo codice. Questo è gestito per te da upstart.

Se si desidera interrompere o avviare il processo si può farlo con

service chat start 
service chat stop 

Il nome chat viene trovato automaticamente dal nome del file .conf all'interno /etc/init

Sono solo copre il basi di upstart qui. Ci sono molte altre funzionalità per renderlo ancora più utile. Tutto disponibile eseguendo man upstart.

Questo metodo è molto più conveniente rispetto alla scrittura del proprio codice di daemonizzazione. Un file di configurazione di 4-8 linee per un componente di Ubuntu integrato è molto meno incline all'errore rispetto al fatto che il tuo codice è in grado di raddoppiare la forchetta in modo sicuro e quindi di controllarlo in un altro processo per assicurarsi che non vada via.

Monit è un po 'un'aringa rossa. Se si desiderano avvisi di tempi di inattività, è necessario eseguire un programma di monitoraggio su un server separato separato. Affidatevi a upstart per mantenere il processo sempre in esecuzione su un server. Quindi disporre di un servizio diverso che assicuri che il server sia effettivamente in esecuzione. I tempi di fermo avvengono per molte ragioni diverse. Un processo in esecuzione sullo stesso server non ti dirà esattamente nulla se il server stesso non funziona. Hai bisogno di una macchina separata (o di un provider di terze parti come pingdom) per avvisarti di questa condizione.

+0

Esiste una fonte autentica che supporti la risposta? L'esecuzione su Ubuntu è un'opzione ma non obbligatoria (daemonize funzionerà su entrambi). In secondo luogo è necessario utilizzare Monit anche con upstart per ottenere avvisi di tempi di inattività. – mtariq

+0

È possibile ottenere upstart per email quando si ferma/inizia (http://serverfault.com/questions/236925/how-can-i-receive-an-email-when-an-upstart-monitored-script-respawns) . fonte autentica? Le persone usano la produzione in tutto il mondo. Usiamo upstart in produzione Non è possibile utilizzare monit per gli avvisi di downtime. È inutile. Vedi la risposta modificata per il motivo. – aychedee

+0

Ottimo post. Upstart si trova nell'albero Debian, quindi probabilmente può essere usato in vanilla debian o mint e anche in altri derivati. – meawoppl

3

ho usato vecchio stile initscript con start-stop-daemon utility.Look a skel in /etc/init.d

5

si potrebbe verificare supervisor. Ciò di cui è capace è avviare un processo all'avvio del sistema e mantenerlo attivo fino allo spegnimento.

Il file di configurazione più semplice sarebbe:

[program:my_script] 
command = /home/foo/bar/venv/bin/python /home/foo/bar/scripts/my_script.py 
environment = MY_ENV_VAR=FOO, MY_OTHER_ENV_VAR=BAR 
autostart = True 
autorestart = True 

allora si potrebbe collegarlo al /etc/supervisord/conf.d, eseguire sudo supervisorctl per entrare console di gestione di supervisore, tipo in reread modo che supervisore Annunci nuova voce config e update per visualizzare nuova programmi nell'elenco status.

Per avviare/riavviare/arrestare un programma è possibile eseguire sudo supervisorctl start/restart/stop my_script.

+0

Una nota generale per i lettori che il supervisore non funziona con Python 3. – shongololo

Problemi correlati