Busybox下start-stop-daemon启动守护进程stdout日志存文件问题问询
BusyBox环境下start-stop-daemon后台运行并输出日志的解决方案
问题根因
BusyBox v1.32.0版本的start-stop-daemon使用--background参数时,会在fork后台子进程后默认关闭所有标准输入输出文件描述符,并重定向到/dev/null,因此你在命令外层加的重定向规则会失效,同时该版本没有--no-close参数保留FD,所以需要换用其他实现方式。
可行解决方案
不需要更换init系统,以下方案都可以在当前BusyBox+init.d架构下稳定运行:
方案1:在shell层完成后台运行与重定向(最简便)
你提到的末尾加
&的写法完全可以正常使用,只要补充pid文件的创建逻辑就符合init.d脚本的规范,不需要依赖start-stop-daemon的--background能力:# 启动前先确保日志文件存在、权限正确 touch /var/log/my-daemon chown <运行用户>:<用户组> /var/log/my-daemon start-stop-daemon -S -x $DAEMON -- $ARGS >> /var/log/my-daemon 2>&1 & # 记录pid到pidfile,方便stop操作 echo $! > /run/my-daemon.pid这种写法的逻辑是由当前shell完成后台fork和重定向,
start-stop-daemon只负责执行进程启动的权限、重复进程校验逻辑,完全符合init.d脚本的常规实现,不存在不规范的问题。方案2:将重定向逻辑封装到shell子进程中
如果一定要使用
start-stop-daemon的--background参数,可以让start-stop-daemon启动一个shell子进程,在子进程内完成重定向操作:start-stop-daemon -S --background -x sh -- -c "$DAEMON $ARGS >> /var/log/my-daemon 2>&1"这个方案的原理是:
--background关闭FD的操作是作用在sh进程上,但sh进程内部启动的$DAEMON的输出已经被提前重定向到了日志文件,因此不受FD关闭的影响。如果需要指定运行用户,可以加上-u <用户名>参数。方案3:使用日志中转工具
如果担心日志输出丢行、需要日志轮转,可以配合
logger或者tinylog这类轻量日志工具中转输出:start-stop-daemon -S --background -x sh -- -c "$DAEMON $ARGS 2>&1 | logger -t my-daemon -f /var/log/my-daemon"
内容的提问来源于stack exchange,提问作者JonasVautherin
相关产品推荐
相关产品推荐

