Нетрудно собрать выходные данные демона и сохранить их в файл:
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas $DAEMON --no-close \
-- $DAEMON_ARGS >> $LOGFILE 2>&1
Однако это решение может быть неоптимальным для logrotate
.
Возможно, было бы лучше захватитьвывод в системный журнал.На 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
.Вот некоторые из них:
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"""
Примечание: 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 процесса (супервизор * 1042)*, su
и сам демон).
Минусы : Сложно управлять $PIDFILE
из-за путаницы в параметрах командной строки daemon ;Если демон немедленно завершает работу (например, неверная команда) 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"
правильно сообщает о сбое.
Минусы : нет.
Это победитель - самое простое, аккуратное решение, которое, кажется, работает хорошо.