Non è troppo difficile catturare l'output del demone e salvarlo su file:
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas $DAEMON --no-close \
-- $DAEMON_ARGS >> $LOGFILE 2>&1
Tuttavia questa soluzione potrebbe non essere ottimale per logrotate
.
Potrebbe essere meglio catturare l'output in syslog. Su Debian questo corrisponderebbe al comportamento dei servizi di systemd. Il seguente semplice tentativo di riscrivere l'esempio sopra è sbagliato perché lascia dietro di sé due processi senza genitori ("zombie") (logger e daemon) dopo aver arrestato il daemon perché start-stop-daemon
termina solo il suo figlio ma non tutti i discendenti:
## Do not use this!
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas /bin/sh \
-- -c """exec $DAEMON $DAEMON_ARGS | /usr/bin/logger --tag $NAME"""
Per farlo funzionare abbiamo bisogno di un wrapper che termini i suoi figli quando riceve SIGTERM
da start-stop-daemon
. Ci sono alcuni:
duende :
start-stop-daemon --start --background \
--pidfile $PIDFILE \
--startas /usr/sbin/duende \
-- --pid $PIDFILE --chroot=/ --uid 65534 --ident $NAME \
/bin/su --login $DAEMON_USER --shell /bin/sh --command """exec ${DAEMON} $DAEMON_ARGS"""
Nota: uid=65534
è un utente nobody
.
Pro : funziona ed è relativamente facile.
Contro : 4 processi (supervisore duende
, relativo fork con privilegi rimossi (logger) su
e daemon stesso); obbligatorio --chroot
; Se il daemon termina immediatamente (ad es. Comando non valido) status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
segnalalo come avviato correttamente.
demone :
start-stop-daemon --start --pidfile $PIDFILE \
--startas /usr/bin/daemon \
-- --noconfig --name $NAME --stderr=syslog.info --stdout=syslog.info \
-- /bin/su --login $DAEMON_USER --shell /bin/sh --command """exec $DAEMON $DAEMON_ARGS"""
Pro : 3 processi (supervisore daemon
, su
e demone stesso).
Contro : difficile da gestire a $PIDFILE
causa delle confuse opzioni della riga di comando del demone ; Se il daemon termina immediatamente (ad es. Comando non valido) status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
segnalalo come avviato correttamente.
pipexec ( il vincitore ):
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas /usr/bin/pipexec -- -k \
-- [ D $DAEMON $DAEMON_ARGS ] [ L /usr/bin/logger --tag $NAME ] '{D:2>D:1}' '{D:1>L:0}'
Pro : 3 elabora (supervisore pipexec
, logger
e demone stesso); Se il daemon termina immediatamente (es. Comando non valido) status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
riporta correttamente l'errore.
Contro : nessuno.
Questo è il vincitore: la soluzione più semplice e precisa che sembra funzionare bene.
--start
con--stop
funziona effettivamente.