[Python] Ubuntu Server 13.10 + Python come Servizio
Daniele Varrazzo
piro a develer.com
Gio 17 Apr 2014 18:02:04 CEST
On 2014-04-17 15:42, Dario Concilio wrote:
> Ciao a tutti,sono alle prese con un progetto in python che, al suo
> avvio, si occupa di aprire 2 seriali e un web socket, dopodiché
> rimane
> in ascolto (su 3 thread paralleli).Riceverà diverse richieste che,
> avranno come effetto, l'aggiornamento di dati su un database
> postgresql.
> Fin qui siamo nella norma, adesso vorrei automatizzare il tutto.Ho
> preparato un piccolo server (Intel NUC) con Ubuntu Server 13.10,
> vorrei fare in modo di avviare il mio python all'avvio e gestirlo
> come
> servizio.Quindi gestire start, stop e restart, ma anche poter
> consultare gli eventi generati dal python/servizio.Per gli eventi ho
> usato la libreria logging, quindi traccio già info, warning ed error.
> Adesso il mio dilemma è: qual'è la via migliore al momento? Non ho
> mai fatto un servizio su linux/python, quindi mi trovo a corto di
> nozioni in merito.
> Ho questo post per le mani, secondo voi è la via
>
> giusta?http://stackoverflow.com/questions/4705564/python-script-as-linux-service-daemon
> Avevo già preparato il file miopython.conf sotto init, ma non mi è
> chiaro il punto di contatto tra un eventuale comando di restart o
> stop
> da terminal, e un paio di metodi in python che si occupano, a fronte
> (ad esempio di "service mypython stop"), la chiusura delle seriali,
> del socket e i relativi thread.
> PS: Ricordate che sono junior in ambito python/linux (solo 2 anni di
> esperienza), quindi abbiate pazienza, se commetto errori, magari
> nella
> terminologia (sto cercando di uscire dallo schema mentale MS Windows)
> A presto.Dario Concilio
Sì, creare uno script per upstart è la maniera più semplice di fare e
quell'articolo menziona il minimo indispensabile per partire, che è già
sufficiente.
Il tuo programma non deve fare niente di speciale: si deve limitare a
morire quando gli viene chiesto :) Thread e socket vengono chiusi quando
il processo termina. Upstart di default invia un TERM al processo: puoi
simulare come si comporta il tuo processo usando kill (TERM è il segnale
di default). Se morire e basta non è sufficiente puoi intercettare il
segnale usando il modulo 'signal' di python
(https://docs.python.org/2/library/signal.html) e facendo qualcosa di
diverso o aggiuntivo. Questo però richiede una certa attenzione: se
riesci ad evitare è meglio. Puoi anche configurare il tuo script upstart
per mandare un segnale diverso al processo
(http://upstart.ubuntu.com/cookbook/#kill-signal).
Il restart di upstart dovrebbe essere solo uno stop + uno start: se il
tuo programma muore con grazia (e riparte!) dovresti essere a posto. Se
vuoi anche implementare il reload devi intercettare SIGHUP (sempre
usando 'signal') e scrivere il codice che riconfigura il programma senza
riavviarlo (e anche questo puoi testarlo con "kill -HUP").
Insomma, se il tuo programma deve fare qualcosa di diverso che non sia
partire e fermarsi il punto di contatto dovrebbero essere i signal
handler unix, e per gestirli dal tuo programma devi usare il modulo
'signal'.
-- Daniele
Maggiori informazioni sulla lista
Python