Es ist nicht allzu schwer, die Ausgabe des Dämons zu erfassen und in einer Datei zu speichern:
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas $DAEMON --no-close \
-- $DAEMON_ARGS >> $LOGFILE 2>&1
Diese Lösung kann jedoch für nicht optimal sein logrotate
.
Es ist möglicherweise besser, die Ausgabe in Syslog zu erfassen. Unter Debian würde dies dem Verhalten von systemd-Diensten entsprechen. Der folgende einfache Versuch, das obige Beispiel neu zu schreiben, ist falsch, da nach dem Stoppen des Daemons zwei übergeordnete Prozesse ("Zombie") (Logger und Daemon) zurückbleiben, da start-stop-daemon
nur sein untergeordnetes Element, aber nicht alle Nachkommen beendet werden:
## 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"""
Damit es funktioniert, benötigen wir einen Wrapper, der seine untergeordneten Elemente beim Empfang SIGTERM
von beendet start-stop-daemon
. Dort sind einige:
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"""
Hinweis: uid=65534
ist ein Benutzer nobody
.
Vorteile : Es funktioniert und es ist relativ einfach.
Nachteile : 4 Prozesse (Supervisor duende
, Fork mit verworfenen Berechtigungen (Logger) su
und Daemon selbst); obligatorisch --chroot
; Wenn der Dämon sofort beendet wird (z. B. ungültiger Befehl), status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
melden Sie ihn als erfolgreich gestartet.
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"""
Pros : 3 - Prozesse (Supervisor daemon
, su
und Dämon selbst).
Nachteile : $PIDFILE
Aufgrund der verwirrenden Befehlszeilenoptionen des Dämons schwierig zu verwalten . Wenn der Dämon sofort beendet wird (z. B. ungültiger Befehl), status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
melden Sie ihn als erfolgreich gestartet.
pipexec ( der Gewinner ):
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 - Prozesse (Supervisor pipexec
, logger
und Daemon selbst); Wenn der Daemon sofort beendet wird (z. B. ungültiger Befehl) status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
, melden Sie den Fehler korrekt.
Nachteile : keine.
Dies ist der Gewinner - die einfachste und ordentlichste Lösung, die anscheinend gut funktioniert.
--start
durch--stop
tatsächlich funktioniert.