・ffmpegが文字を食う?
何が原因かよく分からないのだけれど、とりあえず症状を絞り込めたので。。
「らじる★らじる」の録音用スクリプト、rtmpdumpで録音した後、 ffmpegでflvからm4aに変換する部分、こういう感じの処理にしている。
#!/bin/sh flvfile=/home/kojima/Radiru_new/test1.flv m4afile=/home/kojima/Radiru_new/test1.m4a ffmpeg -v error -i $flvfile -acodec copy $m4afile sleep 3 if [ -f "$m4afile" ]; then rm -f $flvfile fi
このスクリプト、手動で実行する限り特に問題なく終了するのだけれど、 at経由で実行すると、ffmpegの次の行やその次の行が食われて、cron からエラーメールが届くことになる。
$ cat ~/Maildir/new/1441892102.V803I18473dM4378.corei3 Return-Path: <kojima@corei3.linet.gr.jp> X-Original-To: kojima Delivered-To: kojima@corei3.linet.gr.jp Received: by corei3.linet.gr.jp (Postfix, from userid 1000) id E8FBC20793D; Thu, 10 Sep 2015 22:35:01 +0900 (JST) Subject: Output from your job 10485 To: kojima@corei3.linet.gr.jp Message-Id: <20150910133501.E8FBC20793D@corei3.linet.gr.jp> Date: Thu, 10 Sep 2015 22:35:01 +0900 (JST) From: kojima@corei3.linet.gr.jp (KOJIMA Mitsuhiro) sh: 行 53: 一致する `"' を探索中に予期しないファイル終了 (EOF) です sh: 行 60: 構文エラー: 予期しないファイル終了 (EOF) です
この例は if [ -f " あたりまで食われてしまっているようだけど、 あれこれ試したら sleep 3 が食われて "leep not found" や "3 not found"みたいな エラーになることもある。
当初はファイル名依存の問題なのかな、と思っていたけれど、 あれこれ条件を変えながら試してみると、 どうもファイル名ではなく、 録音時間が1時間を越えるとこのエラーが発生し、 録音時間が長くなる(= ffmpeg で変換するサイズが大きくなる)につれて、 食われる文字数が増えてゆく感じ。
# 録音時間が15分程度の語学講座だとこの問題は発生せず、1時間を越えると発生しだす模様
何となく ffmpeg のメモリ管理回りのバグっぽい気がしているのだけれど、cron ではなく直接このシェルスクリプトを実行すると同じエラーが起きないのが謎。
# stdin/stdout が繋がってるか否かにも依存するのかなぁ?
とりあえず、ffmpeg の変換の次の行に、
####################################### this is only a place holder
みたいな食われるための行を追加してやれば回避できそうなんだけど、 いまいち納得行かないところ。
ffmpeg -v error -i $flvfile -acodec copy $m4afile < /dev/null
みたいに何か標準入力をつないでやるとエラーは発生しなくなったですね。 (標準出力は /dev/null にしなくても大丈夫みたい)
やっぱりffmpegが標準入力からの入力を求め、 /dev/stdin なりにつながっていて読めれば実際のデータの有無は構わないものの、at で実行して標準入力が無い場合はスクリプト自身を食ってしまう、ということなのかな -- kojima 2015-09-14 (月) 21:30:11