No es demasiado difícil capturar la salida del demonio y guardarla en un archivo:
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas $DAEMON --no-close \
-- $DAEMON_ARGS >> $LOGFILE 2>&1
Sin embargo, esta solución puede no ser óptima para logrotate.
Podría ser mejor capturar la salida en syslog. En Debian esto coincidiría con el comportamiento de los servicios systemd. El siguiente intento directo de reescribir el ejemplo anterior es incorrecto porque deja atrás dos procesos sin padres ("zombi") (registrador y demonio) después de detener el demonio porque start-stop-daemontermina solo su hijo pero no todos los descendientes:
## 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"""
Para que funcione, necesitamos un contenedor que termine sus hijos al recibir SIGTERMde start-stop-daemon. Hay algunos:
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=65534es un usuario nobody.
Ventajas : funciona y es relativamente fácil.
Contras : 4 procesos (supervisor duende, su bifurcación con privilegios eliminados (registrador) suy el propio demonio); obligatoria --chroot; Si el demonio termina de inmediato (por ejemplo, un comando no válido), status_of_proc -p $PIDFILE "$DAEMON" "$NAME"infórmelo como iniciado correctamente.
demonio :
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"""
Pros : 3 procesos (supervisor daemon, suy daemon sí mismo).
Contras : Difícil de administrar $PIDFILEdebido a las opciones confusas de la línea de comandos del demonio ; Si el demonio termina de inmediato (por ejemplo, un comando no válido), status_of_proc -p $PIDFILE "$DAEMON" "$NAME"infórmelo como iniciado correctamente.
pipexec ( el ganador ):
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}'
Pros : 3 Procesos (supervisor pipexec, loggery Daemon sí mismo); Si el demonio termina de inmediato (por ejemplo, un comando no válido) status_of_proc -p $PIDFILE "$DAEMON" "$NAME", informe correctamente el error.
Contras : ninguno.
Este es el ganador: la solución más sencilla y ordenada que parece funcionar bien.
--startcon--stoprealmente funciona.