PT3+epgrec UNAでGUIメニューからのサスペンド復帰後に録画失敗するのを防止する
PT3+epgrec UNAを専用の録画サーバではなく普段使いのデスクトップPCで使用しているが、普段使いのデスクトップPCなのでサスペンドをすることがある。PT3をlinuxで使う際、サスペンドからの復帰で番組受信ができなくなる不具合があるが、「DN2800MT + CentOS6.3 + PT3 ACPI サスペンド : 事象の水平線 :」 に掲載されている方法で対応できている。
ただ、pm-suspendを実行してもウンともスンとも言わない場合があり、そのようなときにうっかりGUIメニューからサスペンドを実行してしまうと、サスペンド復帰後に番組受信ができず予約録画に失敗する。これで何度か煮え湯を飲まされたので対応することにした。
ユーザwww-dataでsudoコマンドを実行できるようにする(modprobeコマンド限定)。
sudo visudo # 以下を追記 www-data ALL=(ALL) NOPASSWD:/sbin/modprobe
reclib.phpの913行目に以下「+」の箇所を追記する。
<?php if( $st['exitcode'] !== 0 ){ reclog( 'command error['.$st['exitcode'].'] '.$cmd.$rststk, EPGREC_WARN ); + // チューンできていないようならドライバをロードする + if (strpos($rststk,'Cannot tune to the specified channel') !== false){ + exec('sudo /sbin/modprobe -r pt3_drv && sudo /sbin/modprobe pt3_drv'); + } return 2; }else if( $rst_view && $rststk!=='' ) ?>
またリアルタイム再生の場合にも同様に、GUIメニューからのサスペンド復帰で再生に失敗した際、コマンドを手打ちしてドライバをアンロード・ロードするのが面倒なので、自動で行なわせるようにする。
sendstream.php 271行目〜に「+」の箇所を追記する。
<?php // 常駐失敗? PID取得失敗 $errno = posix_get_last_error(); reclog( 'sendstream.php::録画コマンドPID取得失敗('.$errno.')'.posix_strerror($errno ), EPGREC_WARN ); + // おそらくドライバの問題なのでロード + exec('sudo /sbin/modprobe -r pt3_drv && sudo /sbin/modprobe pt3_drv'); ?>
参照サイト
- ApacheユーザでPHPからsudo権限のシェルをたたく - 日報 #130 - 俺の報告
apacheユーザ(www-data)にsudo権限を持たせる方法について。/etc/sudoersをvisudoコマンドで編集する。
- 【PHP】特定の文字列を含むかのチェック - Qiita
PHPのstrpos関数について。