Зробити вихід демона і зберегти його у файл не надто важко:
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas $DAEMON --no-close \
-- $DAEMON_ARGS >> $LOGFILE 2>&1
Однак це рішення може бути неоптимальним для logrotate
.
Можливо, буде краще захопити вихід у syslog. У Debian це відповідало б поведінці системних служб. Наступна прямолінійна спроба переписати наведений вище приклад є помилковою, оскільки після зупинки демона залишає після себе два батьківські ("зомбі") процеси (реєстратор та демон), оскільки start-stop-daemon
припиняє лише свою дитину, але не всіх нащадків:
## 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"""
Для того, щоб змусити його працювати нам потрібна обгортка, завершальну свої дитина після отримання SIGTERM
від start-stop-daemon
. Є кілька:
дуенде :
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"""
Примітка: uid=65534
це користувач nobody
.
Плюси : це працює, і це відносно легко.
Мінуси : 4 процеси (супервізор duende
, його вилка зі скинутими привілеями (реєстратор) su
та сам демон); обов'язкові --chroot
; Якщо демон негайно припиняється (наприклад, недійсна команда)status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
повідомте про це як про успішно запущене.
демон :
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"""
Переваги : 3 процеси (супервізор daemon
, su
і демон сам по собі).
Мінуси : важко керувати $PIDFILE
через заплутаність параметрів командного рядка демона ; Якщо демон негайно припиняється (наприклад, недійсна команда), status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
повідомте про це як про успішно запущене.
pipexec ( переможець ):
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}'
Переваги : 3 процесів (керівник pipexec
, logger
і демон сам по собі); Якщо демон негайно припиняється (наприклад, недійсна команда), status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
правильно повідомте про помилку.
Мінуси : жоден.
Це переможець - найпростіше, акуратне рішення, яке, здається, працює добре.
--start
в--stop
насправді працює.