Scripting
如何排隊程序?
我有一個監控攝像頭和一個程序在檢測到運動時錄製影片。基本上,該程序以非常重的格式保存影片。
我的解決方案是呼叫一個使用 ffmpeg 轉換影片的腳本。每次製作影片時都會呼叫該腳本。
轉換需要的時間相對較短,但會佔用大量 CPU。當一個新影片到達要轉換並且另一個影片的轉換尚未完成時,問題就出現了。在那種情況下,再次呼叫該腳本,導致兩個或多個 ffmpeg 程序使機器在相當長的時間內幾乎掛起。
如何排隊轉換作業,在前一個完成後執行?我想要的是一次只有一個 ffmpeg 程序。
您可以使用作為at
batch
包的一部分的程序(用於作業排隊的工具)。它預設安裝在許多系統上。
我會設置一個隊列目錄並讓一個後台程序通過隊列目錄並產生 ffmpeg 轉換。後台程序的範例可能是:
queue=/var/tmp/vidq outdir=/var/tmp/videos while true; do # do forever for file in $queue/*; do name=`basename $file` mv -f $file $queue/.current ffmpeg -i .current $outdir/$name touch -r $queue/.current $outdir/$name rm $queue/.current done sleep 300 # sleep for 5 minutes done
您必須進行一些安全檢查,例如排隊的文件不是影片文件。並調整睡眠值。但這會生成具有相同名稱和原始日期戳的轉換文件。
另一種方法是檢查文件鎖,當 ffmpeg 程序退出時,鎖被刪除,另一個程序可以啟動,首先創建文件鎖。然而,這意味著邏輯現在在程序中,並且必須跟踪哪些文件需要處理。上面的隊列目錄解決方案,就是前端程序只需要把它投遞到隊列中。