捕获守护进程的输出并将其保存到文件中并不难:
start-stop-daemon --start --background \
--pidfile $PIDFILE --make-pidfile \
--chuid $DAEMON_USER \
--startas $DAEMON --no-close \
-- $DAEMON_ARGS >> $LOGFILE 2>&1
但是,对于logrotate,此解决方案可能不是最理想的。
将输出捕获到系统日志可能会更好。在 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"""
为了使它工作,我们需要一个包装器,它在从start-stop-daemon 接收到SIGTERM 时终止其子级。有一些:
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,它的叉子具有已删除的权限(记录器),@ 987654336@ 和守护进程本身);强制--chroot;
如果守护程序立即终止(例如无效命令)status_of_proc -p $PIDFILE "$DAEMON" "$NAME" 报告它已成功启动。
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"""
优点:3 个进程(主管 daemon、su 和守护进程本身)。
缺点:由于混乱,难以管理 $PIDFILE em>daemon 的命令行选项;
如果守护程序立即终止(例如无效命令)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" 正确报告失败。
缺点:无。
这是赢家——最简单、简洁的解决方案似乎运行良好。