24時間録画する機械であれば、そこそこ安定していてほしいと思うのが人情。 「安定している」という機器の条件を挙げると以下のようなものでは。
「こんなのあたりまえだろう」 って思うよね?みんな。 しかしネットの下馬評を見る限り、ARecX6もガラポンも1.以外は未だに 達成できていないように思えます。一応売り物であるにも関わらず。
要するに監視を強化すればよいのです。死んだチャンネルを見つけてリセット、 ファイルの状態を監視してリセット、プロセスが死んだら再起動する、 この程度で良いはず。
cronで監視用バッチを動かしたりするのがUNIX流なのですが、 ここはさらに1歩進めてDJB daemontoolsを使ってみました(Windowsの仮想CDソフトのことではない、念のため)。
Debian GNU/Linuxの場合はapt-getコマンドでインストール可能です。
# apt-get install daemontools
但し、ソースからコンパイルした場合と異なり、サービスディレクトリは/etc/serviceに なりますので注意。詳しい使い方は daemontools howtoを参照してもらえればと思います。
実際に録画機を作るつもりでファイル配置を考えます。
基本的にdaemontoolsは、
/etc /service /hogeserver (※自分で決めたサービス名) /run (※メインシェルスクリプト) /log /run(※ログ用シェルスクリプト)
という縛りで2つシェルスクリプトを置いておくと、superviseという常駐プロセスが 何がなんでもrunを実行し続ける ものです(やや語弊あり)。cronというよりinitdとinittabに近いか。 しかし、/etc/serviceに直接ディレクトリを掘ると管理が難しいので、全体的には/mnt以下に hogeserverのようなサービスに相当するディレクトリを掘って、そこから/etc/serviceにシンボリックリンクを張るようにします。
また、シェルスクリプトが動作するためには様々なパスや環境変数の設定が必要ですが、 daemontoolsにごちゃごちゃした設定ファイルはない(DJBの流儀ですね)ので、 自前で環境変数等を設定する必要があります。なので、 /mnt/conf.shを用意しておきます(のちに説明する変数類も入っていますがとりえあずこれで)。 daemontoolsのrunスクリプトなどは冒頭でconf.shをロードすることにしておけば、 いろいろ捗るというわけ。
作業用ディレクトリも掘っておきましょう。
# mkdir -p /mnt/dictv (Webサーバで露出させたくないスクリプト用) # mkdir -p /mnt/spool/session (セッション保存用) # mkdir -p /mnt/log (daemontoolsのログ) # mkdir -p /mnt/admin (Webサーバで露出させたくない管理ファイル用) # mkdir -p /mnt/ts (録画TSを記録するディレクトリ) # mkdir -p /mnt/windex (データベース用) # mkdir -p /mnt/oneseg24 (Webトップページ)
前置きが長いねこりゃ。すみません全然終わりそうにないです。
今日はチューナーサービスを開発するので/mnt/tunerというディレクトリを掘っておきましょう。
# mkdir -p /mnt/tuner
拙作LOG-J200ドライバではDVB toolsのdvbstremをそのまま使います。チューナー番号を環境変数num, 設定周波数を環境変数FREQにはいっていると仮定したコマンドは、こんな感じ。
dvbstream -c $num -f $FREQ 8192 -o | (標準出力のパイプ)
電波状況が悪くなった場合dvbstreamは終了する。 UNIXではパイプの前段のプロセスが終わると(シェルが)後段のプロセスを回収してくれるので、全体も終了することになる。これで課題2.はOK。スクリプト全体は /mnt/tuner/dvbstream.shとして保存しておきます。
しかし....ここで後段にくるのは 先日更新したdumpeitなのですね...... 例えばチューナー検波はずっとまともでTSストリームも出てくるが、 なにかの拍子にdumpeitのバグでTSファイルが作られない ことは容易に想像つくわけです。3.を満たすためにスクリプトで工夫することにします。
ここは単純に、「受信できていれば、現在時刻の/mnt/ts/YYMMDD/YYMMDDhh_ChXX.tsというファイルが作られるはずだ!」という仮定に従って、これをシェルスクリプト /mnt/tuner/runに記述します。ポイントはこの部分、
if [ -f $DVBPID ] ; then ※プロセスいきてる? if [ -f $TSFILE ] ; then ※TSファイルがある? echo "FOUND: I: " $i " CH:" $ch " TS:" $TSFILE else echo "FREEZE?: I: " $i " CH:" $ch " TS:" $TSFILE kill -TERM `cat $DVBPID` sleep 15 /mnt/tuner/dvbstream.sh $i $ch & fi else echo "DEAD?: I: " $i " CH:" $ch " TS:" $TSFILE /mnt/tuner/dvbstream.sh $i $ch & fi
以上。しかしこれには盲点があって、「PCのシステム時計が常に正しい」ことを想定しているので色々アレかもしれません(^^;