|
|
SambaとREGZA Z2000
|
地デジTV「REGZA Z2000」LANをREGZA用に改良する録画用ハードディスクの追加番組録画用共有ポイント作成番組の録画データを解析する録画からの期間で自動消去使用ディスク容量で自動消去ビデオ&写真の共有ポイントREGZAチューナーD-TR1追加 |
空き容量を確保しながら番組を自動消去する
計画倒れに終わった「ゴミ箱方式
・共有ポイントの数は 一つだけ にして家族が悩まないようにする。 ・録画データを自動で移動するような、家族が 直感的に解りにくい処理 を行わないようにする。 というコンセプトです。 考えてみれば録画に利用する ハードディスク は500 GB ですから、BSデジタル放送でも50時間近くは録画できることになります。 つまりこれだけ録画できるのであれば一か月分くらいの番組は格納できるはずですし、録画して一ヶ月見なければ「録画したものの見るつもりがなくなった。」ということになるわけですから、保存版だの何だのと考える必要もないはずです。 そこで、共有ポイントの使用容量が一定量を超えたら自動的に古い録画データから削除するスクリプトを作成しました。
使用容量が一定量を超えたら録画データを消去するスクリプト"video_del.sh"
このスクリプトを利用するにあたっては、ゴミ箱方式
REGZA Z2000に録画機器はひとつだけ これなら子供でもREGZA Z2000上での録画機器の選択に悩むことはないはずです。
もちろんREGZA Z2000からの
ロック
操作が効かないのは前と同じですから
|
||||||||||||||||||||||||
| ただ、ゴミ箱方式を引き継いで "保存フォルダ/" をそのまま利用することにします。 |
ただ、このスクリプトは "/REGZA/rec/" より下のディレクトリには働きませんから、適当なディレクトリを作ればそこが自動的に「保存用フォルダ」として使えることになります。 これならゴミ箱方式のときのように録画データの移動などで保存場所がわからなくなったりすることはないでしょう。 というわけで "/REGZA/" のディレクトリ構成は以下のように非常にシンプルになりました。
スクリプト"video_del.sh"を利用するためのディレクトリ構成
録画データの削除用のテンポラリディレクトリ
"del_temp/"
が必要なのはゴミ箱形式のときと同じです
以下スクリプト内容の説明ですが、このスクリプトはディレクトリ "/REGZA/rec/" 内だけでほとんどの動作を行うので、最初に、
と記述し、スクリプト中の パス 表記ができるだけ単純になるよう工夫しています。 1.REGZA Z2000の録画・再生中を判定する1. はREGZA Z2000の動作とこの スクリプト の動作が干渉しないようにするための判定です。
2.共有ポイントの使用容量の上限の設定2. で "/REGZA/rec/" 以下に保存する番組の録画データの合計容量の上限を設定します。
現在録画に使用しているのは500
GB
の専用ハードディスクです
このハードディスクは LinuxOS の管理上440GBですので、その約80%である350GBを初期値として設定しています。 ちなみに、 bash の シェル スクリプト で扱う変数は 文字列型 が基本ですので、 "declare -i" で変数 "dulimit" を強制的に 整数型 として宣言します。 また、この数値は du コマンド を "-m" オプションで出力した数値と比較しますから MB の値として "350000" と設定します。 3.共有ポイントの使用容量を変数に読み込み3. は du コマンド の出力結果を 整数型 として読み込む部分です。
既にこの スクリプト の冒頭で cd コマンド を使って録画用共有ポイント "/REGZA/rec/" に移動していますから、 "du . -sm" と実行することで、ディレクトリ "/REGZA/rec/" の使用容量を「その階層以下の合計容量のみを MB 単位で」 標準出力 します。 ただし実際の出力結果は
となり、整数型変数に読み込むには
カレント
ディレクトリ表記
"."
が余分です
そこでこの出力結果から数値部分(つまり使用容量MB)を取り出すために
パイプ処理
つまりこの例では変数 "duvalue" に "306110" が代入されることになります。 4.使用容量の上限値と現在の使用容量を比較する4. は "while" 文を使った制御ループです。
"while" に続く条件式は 「変数"duvalue(実際のディスク使用容量 3. )"が"dulimit(共有ポイントの使用容量の上限 2. )"よりも大きいときに真。」 という設定になっていて、この条件を満たす場合に に "do〜done" 内を実行します。 この "do〜done" には、 "/REGZA/rec/" の中の録画データを一つずつ "/REGZA/del_temp/" に移動させる処理が記述してあり、一つ移動処理を行うごとにこの条件式に当てはめて、共有ポイントの使用容量 "duvalue" が共有ポイントの使用容量の上限値 "dulimit" を下回るまで "while" のループが繰り返されます。 5.一番古い"*.dtv"を変数に代入
5.
で
"/REGZA/rec/"
の
ls
コマンド
によるファイル一覧の出力結果を、パイプ処理
lsコマンドを
"-t"
オプション付きで実行すると、ファイルの
タイムスタンプ
の新しい順に
標準出力
しますが、この出力は三種類の録画用ファイル名が混ざっていますから
ちなみにここでフィルタ文字列を ".dtv" と指定すると、 "*.dtv" だけではなくて "*.dtv.meta" や "*.dtv.rat" も該当してしまいますから、末尾を意味する機能文字 "$" を使って ".dtv$" と指定して 「".dtv"で終わる文字列を含む行。」 を抽出してやります。 そして更に"tail -1"で一番最後の行だけを抜き出してやれば、 「録画開始時刻が一番古い録画データの本体ファイル名"*.dat"。」 を変数 "fname" に代入することができるわけです。 ところで同じ処理はgrepコマンドを使わずに、
でも良さそうに思えます。 しかしlsコマンドは ワイルドカード を指定した場合、該当するファイルが見当たらないとエラーになりますから、 録画データがひとつもない場合に にこのコマンドが実行されるとスクリプトがエラーメッセージを出力してしまいます。 もちろん実用上はこれでも問題ないのですが、エラーは出さないに越したことはないのであえてgrepコマンドで処理しているというわけです。 6.9.録画データが見つからないときの処理"/REGZA/rec/" に録画データが最初から存在しないとき、あるいは "while" ループが何度か回った結果、録画データがなくなってしまったとき、 5. で変数 "fname" に代入されるのは 空白文字列"" となります。 変数"fname"はこれから削除すべき録画データファイルを指定するためのファイル名が入力されるべきものですが、ここが空白文字列になってしまうと後に実行される録画データファイルの移動コマンド、
が、
となってしまうため、引数が足りずに書式エラーになってしまいます。 そこで、この 6. で変数"fname"の内容が空白文字列かどうかを判定し、空白文字列の場合に移動コマンドを実行させないように制御します。
この "if" 文は、変数"fname"が空白文字列の場合に限って 偽 となり、 "then" 以降がスキップされて "else" 以降が実行されます。 つまり、 "No Video DATA" を出力して録画データがないことをレポートし、変数 "duvalue" に "0" を代入するわけですが、これにより 4. の "while" ループの条件式が必ず 偽 になってループが終了することになります。 7.削除対象録画データの"del_temp/"への移動7. では mv コマンド で、 "/REGZA/rec/" 以下で削除されるべきデータを、いったん "/REGZA/del_temp/" に移動します。
mvコマンドに "-f" オプションを付けているのは、移動するファイルが存在しないときにエラーを出させないようにするためです。 一行目のmvコマンドにだけ "-v" オプションを付けているのは、移動された "*.dtv" を プロンプト やレポートメールで確認できるように 標準出力 するためです。 しかしこの出力をmvコマンドだけで行うと、
と、「どのファイルが何処に移動されたか。」までご丁寧にレポートしてくれますが、実際に知りたいのは「どのファイルが移動されたか」だけで構いません。
そこでパイプ処理
と、ファイル名の主要な部分だけを表示するようにしているわけです。 8.共有ポイントの使用容量を変数に再読み込み内容は 3. とまったく同じで、 du コマンド の出力結果で変数 "duvalue" の値を更新します。
つまり、更新された "duvalue" の値でもう一度 4. の条件式と比較して、 "dulimit" の値より小さくなっていれば 4. のループを終了し、まだ大きければもう一度ループを実行する、という具合になります。 10.録画データを削除する10. で "/REGZA/del_temp/" 以下に集められた録画データをまるごと削除します。
rmコマンドに "-f" オプションを付けているのは、削除するファイルが存在しないときにエラーを出させないようにするためです。
|
||||||||||||||||||||||||
裏方のスクリプトとはかくあるべきですね作成した シェル スクリプト は "video_del.sh" というファイル名で保存しました。 このスクリプトは "root" でのみ実行しますから、所有者と所有グループを "root" にして chmod コマンド で パーミッション を "700" にしました。 そして "/etc/cron.daily/" に放り込んで終了です。 このスクリプトが稼動し始めると、REGZA Z2000で "REC(WEB0)" に録画した番組は ハードディスク の空き容量が約100 GB を切ると、古い録画データから自動的に削除されるようになります。 この100GBという容量は、BSデジタル放送で約10時間、地デジで15〜17時間、従来画質(SD)放送で30時間くらいに相当します。 年末年始の超ロング放送の特番でもせいぜい数時間ですから、常にこのくらい空き容量が維持できていれば問題はないでしょう。 |
|||||||||||||||||||||||||
| スクリプト内で実行される du コマンドは "/REGZA/rec/" 以下の使用容量の合算を出力するので、 "保存フォルダ/" に移動してもこの出力は変化しません。 |
消されたくない番組はレグザリモコンを使って "保存フォルダ" に移動しておけばOKです。
お便利サーバー.com宅のREGZA Z2000の録画状況 つまりこのスクリプトの稼動にあたって、メカ音痴の家族に教えるべきことは、 「ハードディスクが足りなくなったら古い番組は消されるからね。」 「消されたくなかったら保存フォルダに移動しておくように。」 の二つだけです。楽勝です。
また、前回作成した
"video_move.sh"
更に、「保存フォルダ」に移動しておいた番組はそのうち「SAVE」に移動している、といったややこしい処理は行いません。「保存フォルダ」に移動した番組はそのまんま「保存フォルダ」に居座りますから、「あれっ?何処に行った?」ということもないでしょう。 というわけでこのスクリプトは、 「空き容量を確保するために、不要になった録画番組をいちいち消さなくてもいい。」 というとってもありがたい機能を提供しつつ、その スクリプトの存在を意識しなくて良い というシェルスクリプトのお手本のようなものになりました。
|
|
|
録画からの期間で自動消去
<<Previous
|
Next>>
ビデオ&写真の共有ポイント
|
| このサイトは既に更新を終了していますが、今のところ店じまいの予定はありません。 リンクフリー ですので、趣味や勉強のためでしたら、引用、転用、コピー、朗読、その他OKです。このサイトへのリンクについては こちら をご覧ください。 |
| ”Linux”は、Linus Torvalds 氏の各国における登録商標です。”Red Hat”及びRed Hatのロゴおよび Red Hat をベースとしたすべての商標とロゴは、各国におけるRed Hat, Inc. 社の商標または登録商標です。その他のプログラム名、システム名、製品名などは各メーカー、ベンダの各国における登録商標又は商標です。 |