如何在Ubuntu系统中每隔1分钟执行一次ffmpeg命令解决推流中断问题
Ubuntu下定时运行FFmpeg推流的最优方案
报错原因说明
你使用watch命令出现语法报错,是因为watch默认将命令传递给/bin/sh解析,命令中的表达式括号、单引号没有正确转义就会触发该问题。而且watch本身不适合长时间后台运行的推流保活场景,更推荐以下两种方案:
方案1:crontab 定时执行(满足每分钟启动的需求)
该方案适合可接受最多1分钟推流中断的场景,实现简单:
- 第一步:将FFmpeg命令封装为独立shell脚本,避免重复启动进程
新建/usr/local/bin/ffmpeg_push.sh,内容如下:#!/bin/bash # 检测是否已有同推流任务在运行,避免重复启动 if pgrep -f "ffmpeg.*live-api-s.facebook.com" > /dev/null; then exit 0 fi # 执行推流命令 /bin/ffmpeg -f lavfi -i anullsrc -rtsp_transport udp -i 'rtsp://admin:password@hostname.com:500/Streaming/Channels/101/' -force_key_frames 'expr:gte(t,n_forced*2)' -vf scale=1920:1080 -reorder_queue_size 4000 -max_delay 10000000 -vcodec libx264 -b:v 2500k -pix_fmt yuv420p -acodec aac -f flv 'rtmps://live-api-s.facebook.com:443/rtmp/FB-key' - 第二步:给脚本添加执行权限
chmod +x /usr/local/bin/ffmpeg_push.sh - 第三步:添加crontab定时任务
执行crontab -e编辑定时任务,新增如下行:
配置完成后每分钟会自动执行脚本,无运行中进程时就自动启动推流,所有日志会存入* * * * * /usr/local/bin/ffmpeg_push.sh > /var/log/ffmpeg_push.log 2>&1/var/log/ffmpeg_push.log方便排查问题。
方案2:systemd 服务保活(更适合稳定推流场景)
该方案是最优选择,FFmpeg崩溃后会立刻自动重启,不需要等待1分钟间隔,推流中断时间极短:
- 第一步:和方案1一致,先封装好
/usr/local/bin/ffmpeg_push.sh脚本并添加执行权限 - 第二步:新建systemd服务配置文件
/etc/systemd/system/ffmpeg-push.service,内容如下:[Unit] Description=FFmpeg RTMP 推流服务 After=network.target [Service] Type=simple User=root ExecStart=/usr/local/bin/ffmpeg_push.sh Restart=always RestartSec=1 LimitNOFILE=65535 [Install] WantedBy=multi-user.target - 第三步:重载配置并启动服务
systemctl daemon-reload systemctl enable --now ffmpeg-push.service - 常用维护命令:
- 查看服务运行状态:
systemctl status ffmpeg-push.service - 实时查看运行日志:
journalctl -u ffmpeg-push.service -f
- 查看服务运行状态:
优化建议
- 可以在FFmpeg命令中添加
-loglevel error减少冗余日志输出 - 可添加
-stimeout 5000000参数(单位为微秒,对应5秒超时),避免RTSP源波动时FFmpeg卡住不退出 - 定期清理日志文件,避免占满磁盘空间
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

