You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:09:52