nginx Shell脚本rclone push to object storage在手动运行时有效,但不能以编程方式运行

u1ehiz5o  于 2023-03-22  发布在  Nginx
关注(0)|答案(2)|浏览(244)
背景
  • 我有一个运行nginx-rtmp模块的docker容器
  • 在这个容器上我接收到一个rtmp流,它被记录下来,转换成hls并显示在一个html页面上
  • 通过hls的流式传输和显示工作正常
目标

我的目标是录制大约一个小时(或一定的文件大小),然后保存录音,转换为mp4,推到一个对象存储桶,然后删除旧文件。(然后录制下一个小时等等)

当前实现

我通过编写一个shell脚本实现了这一点,该脚本通过nginx-rtmp模块的exec_record_done函数执行
我的nginx.conf:

...

# RTMP configuration
rtmp {
    server {
        ...
        application live {
                live on;
                recorder all {
                    record all;
                    record_path /var/www/html/stream/mp4;
                    record_max_size 100000K;
                    record_unique on;
                    record_suffix _%d%m%Y_%H%M.flv;
                    exec_record_done /bin/bash /scripts/cleaner.sh $path $dirname $basename;

                }

                ...
        }
    }
}

http {
    ...
}

我的剧本:

#!/bin/bash
path=$1
dirname=$2
basename=$3
newfile="${dirname}/${basename}.mp4"
ffmpeg -y -i $path -acodec libmp3lame -ar 44100 -ac 1 -vcodec libx264 $newfile &&
rm $path
TIME=$(/bin/date +%Y/%m/%d)&&
rclone sync -P $newfile objstor:bucket/$TIME/ &&
rm $newfile
问题

当我手动运行脚本时,整个事情都按预期工作。但是当通过exec_record_done运行时,当达到录制的文件大小时(按预期),脚本生成mp4文件,删除flv(按预期),但不会推送到对象存储。
我很难理解为什么当我手动运行脚本时它可以工作,但当通过exec_record_done运行时却不行。

cwxwcias

cwxwcias1#

我会在脚本中添加日志记录来查找问题。例如,您的某个参数可能为空,或者您的ffmpeg出现了其他问题。

#!/bin/bash
set -eu

## log errors to /tmp/script_errors file 
exec 2>> /tmp/script_errors

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

ffmpeg -y -i "${path}" -acodec libmp3lame -ar 44100 -ac 1 -vcodec libx264 "${newfile}"
rm -f "${path}"
TIME="$(date +%Y/%m/%d)"
rclone sync -P "${newfile}" objstor:bucket/$TIME/
rm -f "${newfile}"
qvk1mo1f

qvk1mo1f2#

感谢Yaser Kalali的回答,我发现rclone找不到rclone. conf。使用--config=选项,我告诉它在哪里可以找到conf文件。现在一切正常!

相关问题