2012-09-22 106 views
1

我有這個bash腳本將.mp4視頻轉換爲.mp3音頻。 它運行,但只循環一次,儘管/ home/myname/mp4dir中有更多的mp4文件。該腳本會將找到的第一個.mp4文件轉換爲.mp3,除非已經存在.mp3文件。這應該在一個循環中完成,但在第一次調用ffmpeg之後,腳本停止。 爲什麼?bash腳本在while循環中停止執行 - 爲什麼?

#!/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 
+0

如果用'echo $ f'替換循環體,它是否工作? – nneonneo

+0

是的,列出所有.mp4文件。腳本在第一次ffmpeg執行後停止。如果我對此進行註釋並將其替換爲回顯,它將運行所有.mp4文件。 –

+0

當你用'bash -x youscript.sh'運行腳本時,你會看到什麼? 'ffmpeg'命令是否完成? –

回答

3

從我們得到的是裏面居然有你遍歷(什麼樣的任何地點的),並且該輸入文件中的註釋ffmpeg至少一旦開始。然後,你卡住了。

添加

&> ffmpeg.outerr < /dev/null 

ffmpeg指揮和監控文件ffmpeg.outerr而你的 「循環」,即FFMPEG,執行。它會告訴你問題是什麼。你可以自己解決這個問題,或者你用這個ffmpeg特定問題使用標記ffmpeg返回到計算器。

+0

'可以做到這一點。只有我不知道爲什麼。日誌文件不顯示任何錯誤,只是ffmpeg的常規輸出。但是通過輸入重定向,循環按預期運行。 –

+0

ffmpeg解決方案是將'-nostdin'標誌添加到'ffmpeg'命令 –

4

試試這個 在終端

創建的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 
1

答案是將'-nostdin'添加到ffmpeg(不會回答這樣的老問題,但仍然在相關的Google搜索中佔上風)。

+0

Cool .. !!這是唯一有效的答案。 –