Não é muito difícil capturar a saída do daemon e salvá-la no arquivo:
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas $DAEMON --no-close \
-- $DAEMON_ARGS >> $LOGFILE 2>&1
No entanto, esta solução pode estar abaixo do ideal para logrotate
.
Talvez seja melhor capturar a saída no syslog. No Debian, isso corresponderia ao comportamento dos serviços systemd. A seguinte tentativa direta de reescrever o exemplo acima está incorreta porque deixa para trás dois processos sem pai ("zumbi") (logger e daemon) depois de parar o daemon porque start-stop-daemon
encerra apenas seu filho, mas não todos os descendentes:
## 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 fazê-lo funcionar, precisamos de um invólucro que encerra suas crianças após o recebimento SIGTERM
de start-stop-daemon
. Há alguns:
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
é um usuário nobody
.
Prós : funciona e é relativamente fácil.
Contras : 4 processos (supervisor duende
, seu fork com privilégios eliminados (logger) su
e o próprio daemon); obrigatório --chroot
; Se o daemon terminar imediatamente (por exemplo, comando inválido), status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
relate-o como iniciado com sucesso.
daemon :
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"""
Prós : 3 processos (supervisor daemon
, su
e daemon si).
Contras : difícil de gerenciar $PIDFILE
devido a opções confusas de linha de comando do daemon ; Se o daemon terminar imediatamente (por exemplo, comando inválido), status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
relate-o como iniciado com sucesso.
pipexec ( o vencedor ):
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}'
Prós : 3 processa (supervisor pipexec
, logger
e daemon si); Se o daemon terminar imediatamente (por exemplo, comando inválido), status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
relate corretamente a falha.
Contras : nenhum.
Esse é o vencedor - a solução mais fácil e organizada que parece estar funcionando bem.
--start
por--stop
realmente funciona.