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

手动正常的rclone对象存储推送脚本,nginx-rtmp自动执行失败

问题排查与解决方案

核心原因分析

手动运行脚本正常,但nginx-rtmp的exec_record_done触发时rclone上传失败,本质是nginx进程的运行环境与用户登录环境不一致,常见场景包括:

  • 环境变量缺失:nginx继承的PATH中没有rclone的路径,或找不到rclone配置文件
  • 权限不足:nginx运行用户(通常是www-data或nginx)无权限读取rclone配置、访问目标文件
  • 无错误日志:脚本执行时的错误输出未被捕获,无法定位具体问题

具体解决步骤

1. 添加脚本日志输出,定位错误

修改脚本,将所有执行日志写入文件,方便排查具体失败原因:

#!/bin/bash
# 定义日志文件路径,确保nginx用户有权写入
LOG_FILE="/scripts/cleaner.log"
# 将所有输出重定向到日志
exec >> $LOG_FILE 2>&1

# 打印当前时间与传入参数,确认参数传递正常
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始处理,参数:path=$1, dirname=$2, basename=$3"

path=$1
dirname=$2
basename=$3
newfile="${dirname}/${basename}.mp4"

echo "[$(date '+%Y-%m-%d %H:%M:%S')] 转码FLV到MP4:$newfile"
ffmpeg -y -i "$path" -acodec libmp3lame -ar 44100 -ac 1 -vcodec libx264 "$newfile"
if [ $? -ne 0 ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] FFmpeg转码失败,退出码:$?"
    exit 1
fi

echo "[$(date '+%Y-%m-%d %H:%M:%S')] 删除原FLV文件:$path"
rm "$path"

TIME=$(/bin/date +%Y/%m/%d)
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 上传到对象存储:$newfile -> objstor:bucket/$TIME/"

# 关键:指定rclone配置文件绝对路径,避免环境变量问题
# 同时使用copy替代sync(sync适用于目录同步,单个文件上传用copy更安全)
rclone copy -P "$newfile" objstor:bucket/"$TIME"/ --config /scripts/rclone.conf
if [ $? -ne 0 ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] Rclone上传失败,退出码:$?"
    exit 1
fi

echo "[$(date '+%Y-%m-%d %H:%M:%S')] 删除本地MP4文件:$newfile"
rm "$newfile"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 处理完成"

2. 修复环境与权限问题

  • 指定rclone绝对路径:手动执行which rclone获取路径(如/usr/bin/rclone),将脚本中的rclone替换为绝对路径,避免PATH缺失问题
  • 迁移rclone配置文件:将用户目录下的.config/rclone/rclone.conf复制到/scripts/rclone.conf,并赋予nginx运行用户读取权限:
    # 假设nginx运行用户是www-data
    chown www-data:www-data /scripts/rclone.conf
    chmod 600 /scripts/rclone.conf
    
  • 目录权限检查:确保/scripts、/var/www/html/stream/mp4目录对nginx用户有读写权限:
    chown -R www-data:www-data /scripts /var/www/html/stream/mp4
    

3. 验证nginx配置参数

确认exec_record_done的参数传递正确,nginx中$path、$dirname、$basename变量能正确解析为文件路径。可通过日志中的参数打印信息验证。

补充说明

  • 建议使用rclone copy替代sync:sync会使目标目录与源完全一致,若源是单个文件,可能意外删除目标目录中已有文件;copy仅上传指定文件,更适合单个文件上传场景
  • 若使用Docker容器,需确保/scripts目录已挂载到容器内,且rclone配置文件已正确复制到容器中

内容的提问来源于stack exchange,提问作者Merlin Duty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:08:07