[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