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-daemonne 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 SIGTERMde 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=65534est 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) suet 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, suet le démon lui - même).
Inconvénients : Difficile à gérer en $PIDFILEraison 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, loggeret 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.
--startpar--stopfonctionne réellement.