捕获守护程序的输出并将其保存到文件并不难:
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas $DAEMON --no-close \
-- $DAEMON_ARGS >> $LOGFILE 2>&1
但是,该解决方案对于可能不是最优的logrotate
。
将输出捕获到syslog可能更好。在Debian上,这将匹配systemd服务的行为。以下直接重写上面的示例的尝试是错误的,因为在停止守护程序后,它仅留下了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"
则将其报告为已成功启动。
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
实际工作。