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-daemon
termina 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 SIGTERM
de 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=65534
es un usuario nobody
.
Ventajas : funciona y es relativamente fácil.
Contras : 4 procesos (supervisor duende
, su bifurcación con privilegios eliminados (registrador) su
y 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
, su
y daemon sí mismo).
Contras : Difícil de administrar $PIDFILE
debido 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
, logger
y 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.
--start
con--stop
realmente funciona.