Il n'est pas trop difficile de capturer la sortie du démon et de l'enregistrer dans un fichier:
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas $DAEMON --no-close \
-- $DAEMON_ARGS >> $LOGFILE 2>&1
Cependant, cette solution peut être sous-optimale pour logrotate
.
Il peut être préférable de capturer la sortie dans syslog. Sur Debian, cela correspondrait au comportement des services systemd. La simple tentative suivante de réécriture de l'exemple ci-dessus est erronée car elle laisse derrière elle deux processus sans parent ("zombie") (enregistreur et démon) après avoir arrêté le démon car start-stop-daemon
ne termine que son enfant mais pas tous les descendants:
## 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"""
Pour le faire fonctionner, nous avons besoin d'un wrapper qui termine ses enfants lors de la réception SIGTERM
de start-stop-daemon
. Il y a quelques:
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"""
Remarque: uid=65534
est un utilisateur nobody
.
Avantages : cela fonctionne et c'est relativement facile.
Inconvénients : 4 processus (superviseur duende
, son fork avec des privilèges supprimés (logger) su
et le démon lui-même); obligatoire --chroot
; Si le démon se termine immédiatement (par exemple, une commande invalide), status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
signalez-le comme démarré avec succès.
démon :
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"""
Avantages : 3 (processus superviseur daemon
, su
et le démon lui - même).
Inconvénients : Difficile à gérer en $PIDFILE
raison de la confusion des options de ligne de commande du démon ; Si le démon se termine immédiatement (par exemple, une commande invalide), status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
signalez-le comme démarré avec succès.
pipexec ( le gagnant ):
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}'
Avantages : 3 (processus superviseur pipexec
, logger
et le démon lui - même); Si le démon se termine immédiatement (par exemple, une commande invalide), status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
signalez correctement l'échec.
Inconvénients : aucun.
C'est le gagnant - la solution la plus simple et la plus soignée qui semble bien fonctionner.
--start
par--stop
fonctionne réellement.