シェルスクリプト バックグラウンド実行が失敗する際の対応策

無断転載禁止 シェルスクリプト バックグラウンド実行が失敗する際の対応策

 

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状態となってしまう。
-shared-img-thumb-tsuruetoushi12_TP_V
 

ジョブステータスの確認

ジョブ状態確認してみる

[user@hoge ]$ jobs
[1]+ Stopped /usr/local/bin/ffmpeg -i test.mp4 create_test.mp4

 

出力ファイルを確認しても、エンコードは進んでいない。

しかし、fgコマンドでフォアグラウンドに呼び戻すと処理が進み始める。

処理待ちっぽいので、標準入力を/dev/nullで捨てる

↑↑↑これがポイントです!!!

-shared-img-thumb-tsuruno7_TP_V
 

正常時の実行例

■実行コマンド

$/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 &

 

動いた!

-shared-img-thumb-tsuruno5_TP_V
 

シェルスクリプトでバックグラウンド実行の確認ポイント

バックグラウンドで実行させる場合は

・標準入力
・標準出力
・標準エラー出力

をどうにかしないと進んでくれなかったりする。