Script Python come Daemon

http://blog.scphillips.com/2013/07/getting-a-python-script-to-run-in-the-background-as-a-service-on-boot/

Invece di fare il “doppio fork” del processo dello script per “demonizzarlo”, si può usare start-stop-daemon per far partire lo script in background.

Nello stile di init si crea uno script da inserire in /etc/init.d :

#!/bin/sh
 
### BEGIN INIT INFO
# Provides: myservice
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Put a short description of the service here
# Description: Put a long description of the service here
### END INIT INFO
 
# Change the next 3 lines to suit where you install your script and what you want to call it
DIR=/usr/local/bin/myservice
DAEMON=$DIR/myservice.py
DAEMON_NAME=myservice
 
# This next line determines what user the script runs as.
# Root generally not recommended but necessary if you are using the Raspberry Pi GPIO from Python.
DAEMON_USER=root
 
# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/$DAEMON_NAME.pid
 
. /lib/lsb/init-functions
 
do_start () {
log_daemon_msg "Starting system $DAEMON_NAME daemon"
start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON
log_end_msg $?
}
do_stop () {
log_daemon_msg "Stopping system $DAEMON_NAME daemon"
start-stop-daemon --stop --pidfile $PIDFILE --retry 10
log_end_msg $?
}
 
case "$1" in
 
start|stop)
do_${1}
;;
 
restart|reload|force-reload)
do_stop
do_start
;;
 
status)
status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $?
;;
*)
echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart|status}"
exit 1
;;
 
esac
exit 0

Commenti

Linee 14 e 15: specificano la posizione dello script.

Linea 16: definisce il nome del demone. Lo script può essere chiamato con questo nome.

Linea 20: imposta il nome utente che lancia lo script. Usare root non è raccomandabile, ma può essere necessario in alcuni casi. E’ meglio creare un utente di sistema.

Linea 25: carica (include) alcune funzioni da un file standard, come le funzioni per il logging.

start-stop-daemon deve sapere qual’è il processo del servizio, per gestirlo per i restart o per uno stop. Nel caso di script, il processo è semplicemente “python”, dunque non può essere usato direttamente (essendo in comune con gli altri script): per questo si crea e si usa il PID con –pidfile $PIDFILE –make-pidfile, essendo il $PIDFILE definito nella riga 23 con PIDFILE=/var/run/$DAEMON_NAME.pid

Uso

Inserire lo script nella directory scelta, e renderlo eseguibile (chmod).
Editare lo script init, e renderlo eseguibile.
A questo punto dovrebbe funzionare con i comandi start stop restart status.
Per lanciarlo automaticamente si devono creare i link simbolici nelle directory /etc/rc*.d/: si può usare il comando update-rc.d myservice.sh

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...