提问人:Alex Monthy 提问时间:9/22/2012 最后编辑:Benjamin W.Alex Monthy 更新时间:11/21/2020 访问量:7004
Bash 脚本在 while 循环中停止执行 ffmpeg - 为什么?
Bash script stops execution of ffmpeg in while loop - why?
问:
我有这个用于将视频转换为音频的 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
答:
3赞
Dr. Jan-Philip Gehrcke
9/22/2012
#1
从我们得到的评论中,实际上有您正在循环的输入文件(无论哪种),并且至少启动一次。然后,你就被卡住了。ffmpeg
加
&> ffmpeg.outerr < /dev/null
到您的命令并在您的“循环”(即 ffmpeg)执行时监控文件。它会告诉你问题是什么。您可以自己解决这个问题,也可以使用标签返回 stackoverflow 处理这个特定于 ffmpeg 的问题。ffmpeg
ffmpeg.outerr
ffmpeg
评论
0赞
Alex Monthy
9/23/2012
这确实是诀窍。只是我不知道为什么。日志文件不显示任何错误,仅显示 ffmpeg 的常规输出。但是通过输入重定向,循环会按预期运行。< /dev/null
3赞
Shammel Lee
5/30/2017
ffmpeg 的解决方案是将标志添加到命令中-nostdin
ffmpeg
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
评论
echo $f
bash -x youscript.sh
ffmpeg
bash -x youscript.sh