Przechwycenie wyjścia demona i zapisanie go do pliku nie jest zbyt trudne:
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas $DAEMON --no-close \
-- $DAEMON_ARGS >> $LOGFILE 2>&1
Jednak to rozwiązanie może być nieoptymalne dla logrotate
.
Lepiej byłoby przechwycić dane wyjściowe do syslog. W Debianie pasowałoby to do zachowania usług systemowych. Poniższa prosta próba przepisania powyższego przykładu jest błędna, ponieważ po zatrzymaniu demona pozostawia dwa procesy bez rodzica („zombie”) (rejestrator i demon), ponieważ start-stop-daemon
kończy tylko jego dziecko, ale nie wszystkie elementy podrzędne:
## 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"""
Aby to działało, potrzebujemy opakowania, które kończy swoje dzieci po otrzymaniu SIGTERM
od start-stop-daemon
. Tam jest trochę:
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"""
Uwaga: uid=65534
jest użytkownikiem nobody
.
Plusy : działa i jest stosunkowo łatwe.
Wady : 4 procesy (nadzorca duende
, jego rozwidlenie z utraconymi uprawnieniami (rejestrator) su
i sam demon); obowiązkowe --chroot
; Jeśli demon natychmiast się zakończy (np. Nieprawidłowa komenda) status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
zgłoś, że został pomyślnie uruchomiony.
demon :
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"""
Zalet : 3 procesy (promotor daemon
, su
i demon siebie).
Wady : Trudne w zarządzaniu $PIDFILE
ze względu na mylące opcje wiersza poleceń demona ; Jeśli demon natychmiast się zakończy (np. Nieprawidłowa komenda) status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
zgłoś, że został pomyślnie uruchomiony.
pipexec ( zwycięzca ):
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}'
Zalet : 3 procesy (promotor pipexec
, logger
i demon siebie); Jeśli demon natychmiast się zakończy (np. Nieprawidłowa komenda), status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
poprawnie zgłoś błąd.
Wady : brak.
Oto zwycięzca - najłatwiejsze, zgrabne rozwiązanie, które wydaje się działać dobrze.
--start
go--stop
faktycznie działa.