ffmpegというエンコーダーを、バックグラウンドで実行しようとしたときに
ちょっとつまづいたのでメモ。
シェルスクリプトでバックグラウンド実行
エラー時の実行例
下記のように何もしないで「&」をつけてバックグラウンドに渡すと
[user@hoge ]$ /usr/local/bin/ffmpeg -i test.mp4 create_test.mp4 & [1] 10466 ← ジョブID=1、プロセスID=10466でバックグラウンドプロセス起動 [user@hoge ]$ ffmpeg version N-79654-g566d64d Copyright (c) 2000-2016 the FFmpeg developers built with gcc 4.8.3 (GCC) 20140911 (Red Hat 4.8.3-9) configuration: --enable-shared --enable-gpl --enable-nonfree --enable-libx264 libavutil 55. 22.101 / 55. 22.101 libavcodec 57. 38.100 / 57. 38.100 libavformat 57. 34.103 / 57. 34.103 libavdevice 57. 0.101 / 57. 0.101 libavfilter 6. 44.100 / 6. 44.100 libswscale 4. 1.100 / 4. 1.100 libswresample 2. 0.101 / 2. 0.101 libpostproc 54. 0.100 / 54. 0.100
——ここで表示が止まるのでEnterを押す———–
[1]+ Stopped /usr/local/bin/ffmpeg -i test.mp4 create_test.mp4 ← ジョブID=1が停止状態になった [user@hoge ]$
Stopped状態となってしまう。
ジョブステータスの確認
ジョブ状態確認してみる
[user@hoge ]$ jobs [1]+ Stopped /usr/local/bin/ffmpeg -i test.mp4 create_test.mp4
出力ファイルを確認しても、エンコードは進んでいない。
しかし、fgコマンドでフォアグラウンドに呼び戻すと処理が進み始める。
処理待ちっぽいので、標準入力を/dev/nullで捨てる
↑↑↑これがポイントです!!!
正常時の実行例
■実行コマンド
$/usr/local/bin/ffmpeg -i test.mp4 create_test.mp4 > /dev/null 2>&1 </dev/null & </dev/null ・・・ 標準入力に/dev/nullを与える > /dev/null ・・・ 標準出力を/dev/nullにリダイレクト 2>&1 ・・・ 標準エラー出力「2」を標準出力「1」に混ぜる「>&」
[user@hoge ]$ /usr/local/bin/ffmpeg -i test.mp4 create_test.mp4 > /dev/null 2>&1 </dev/null & [1] 10598 [user@hoge ]$ jobs [1]+ Running /usr/local/bin/ffmpeg -i test.mp4 create_test.mp4 > /dev/null 2>&1 < /dev/null &
動いた!
シェルスクリプトでバックグラウンド実行の確認ポイント
バックグラウンドで実行させる場合は
・標準入力
・標準出力
・標準エラー出力
をどうにかしないと進んでくれなかったりする。