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-daemontermina 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 SIGTERMda 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) sue 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, sue demone stesso).
Contro : difficile da gestire a $PIDFILEcausa 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, loggere 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.
--startcon--stopfunziona effettivamente.