Ubuntu 16.04下为start-stop-daemon管理的stream服务添加60秒超时
解决init.d脚本添加60秒超时的问题
首先,你遇到的核心问题是错误地将timeout和ffmpeg作为start-stop-daemon的--exec参数传递,导致start-stop-daemon只启动了timeout命令,而没有正确将ffmpeg作为timeout的子进程运行。正确的做法是用--分隔start-stop-daemon的选项和要传递给timeout的参数。
具体修改步骤
1. 定位init.d脚本中的启动逻辑
打开你的/etc/init.d/stream脚本,找到类似这样的启动代码段(通常在start()函数里):
start() { echo "Starting stream..." mkdir -p /var/run/stream start-stop-daemon --start --background --pidfile $PIDFILE \ --exec $DAEMON -- $DAEMON_OPTIONS # 其他启动逻辑... }
其中$DAEMON是ffmpeg的路径(比如/usr/bin/ffmpeg),$PIDFILE是/var/run/stream/stream.pid。
2. 修改启动命令,整合timeout
将启动命令修改为用timeout包裹ffmpeg,注意用--分隔start-stop-daemon的选项和timeout的参数:
start() { echo "Starting stream with 60s timeout..." mkdir -p /var/run/stream # 使用timeout包裹ffmpeg,60秒后强制终止 start-stop-daemon --start --background --pidfile $PIDFILE \ --exec /usr/bin/timeout -- 60 $DAEMON $DAEMON_OPTIONS # 其他启动逻辑... }
- 确保
timeout的路径正确(可以用which timeout查看,通常是/usr/bin/timeout) 60是超时秒数,$DAEMON和$DAEMON_OPTIONS是原来的ffmpeg路径和参数
3. 可选:增强超时终止的可靠性
如果担心ffmpeg收到终止信号后不退出,可以添加--kill-after选项,让timeout在超时后先发送TERM信号,5秒后强制发送KILL信号:
start-stop-daemon --start --background --pidfile $PIDFILE \ --exec /usr/bin/timeout -- --kill-after=5 60 $DAEMON $DAEMON_OPTIONS
4. 测试效果
- 启动服务:
service stream start - 查看进程:
ps aux | grep -E "timeout|ffmpeg",应该能看到timeout和ffmpeg两个进程 - 等待60秒后再次查看,两个进程都应该消失
- 检查服务状态:
service stream status,应该显示已停止
为什么之前的方法无效?
你之前尝试的--exec timeout 60 ffmpeg是错误的:start-stop-daemon会把60和ffmpeg当作--exec的附加选项,而不是传递给timeout的参数。必须用--来明确分隔start-stop-daemon的选项和要传递给目标程序(这里是timeout)的参数,这样timeout才能正确接收60和ffmpeg作为自己的运行参数。
内容的提问来源于stack exchange,提问作者Topper
相关产品推荐
相关产品推荐

