Bash 脚本在 while 循环中停止执行 ffmpeg - 为什么?

Bash script stops execution of ffmpeg in while loop - why?

提问人:Alex Monthy 提问时间:9/22/2012 最后编辑:Benjamin W.Alex Monthy 更新时间:11/21/2020 访问量:7004

问:

我有这个用于将视频转换为音频的 bash 脚本。 它运行,但只循环一次,尽管 ..mp4.mp3/home/myname/mp4dir

脚本将它找到的第一个文件转换为 ,除非已经有一个文件。这应该在循环中完成,但在第一次调用 ffmpeg 后,脚本将停止。.mp4.mp3.mp3

为什么?

#!/bin/bash
find /home/myname/mp4dir -name "*.mp4" | while read f
do
        fOut=`echo $f | sed s/mp4/mp3/`
        echo "convert $f => $fOut"
        if ! test -f $fOut
        then
                ffmpeg -i $f -vn -f mp3 $fOut
        fi
done
bash 循环 while-loop ffmpeg

评论

0赞 nneonneo 9/22/2012
如果将环体替换为 ?echo $f
0赞 Alex Monthy 9/22/2012
是的,列出了所有 .mp4 文件。脚本在第一次执行 ffmpeg 后停止。如果我将其注释掉并用回声替换它,它将运行所有 .mp4 文件。
0赞 Jonathan Leffler 9/22/2012
当你运行脚本时,你会看到什么?命令是否完成?bash -x youscript.shffmpeg
0赞 Alex Monthy 9/22/2012
循环执行不止一次;显示多个 FFMPEG 调用的输出。有什么区别?bash -x youscript.sh
0赞 Alex Monthy 9/22/2012
编辑:对不起,我的错:行为与直接调用脚本相同:它只执行一次。

答:

3赞 Dr. Jan-Philip Gehrcke 9/22/2012 #1

从我们得到的评论中,实际上有您正在循环的输入文件(无论哪种),并且至少启动一次。然后,你就被卡住了。ffmpeg

&> ffmpeg.outerr < /dev/null 

到您的命令并在您的“循环”(即 ffmpeg)执行时监控文件。它会告诉你问题是什么。您可以自己解决这个问题,也可以使用标签返回 stackoverflow 处理这个特定于 ffmpeg 的问题ffmpegffmpeg.outerrffmpeg

评论

0赞 Alex Monthy 9/23/2012
这确实是诀窍。只是我不知道为什么。日志文件不显示任何错误,仅显示 ffmpeg 的常规输出。但是通过输入重定向,循环会按预期运行。< /dev/null
3赞 Shammel Lee 5/30/2017
ffmpeg 的解决方案是将标志添加到命令中-nostdinffmpeg
4赞 kendosan 10/26/2012 #2

试试这个 在终端

创建 bash nohup.sh 并粘贴到这个

#!/bin/sh
while true
do
 /var/www/bash/Someother-bash-script-goes-here.sh
 sleep 60
done

在 nohup.sh 所在的终端类型中

nohup sh nohup.sh >/dev/null 2>&1 &

nohup,每 60 秒执行一次,你可以像这样 grep 服务检查

 #!/bin/sh
SERVICE='ffmpeg'

if ps ax | grep -v grep | grep $SERVICE > /dev/null
then
    echo "$SERVICE service running, will not bother ffmpeg yet"
else
    echo "$SERVICE is not running"
    echo "$SERVICE is not running!" | /var/www/bash/start_service.sh
fi
13赞 Sandor Marton 9/7/2015 #3

答案是添加到 ffmpeg(不会回答这样的老问题,但仍然在相关的 Google 搜索中名列前茅)。-nostdin