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

_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a