このページでは、お便利サーバー.com管理人宅の地デジテレビREGZA Z2000録画データ自動消去するスクリプトについて解説しています。
お便利サーバー.com+相互リンクサイト内をキーワードで検索
SambaとREGZA Z2000

地デジTV「REGZA Z2000」

LANをREGZA用に改良する

録画用ハードディスクの追加

番組録画用共有ポイント作成

番組の録画データを解析する

録画からの期間で自動消去

使用ディスク容量で自動消去

ビデオ&写真の共有ポイント

REGZAチューナーD-TR1追加


録画データの保存期間で削除するスクリプト

まずは "Galileo" ホームAVサーバーGalireoについて の真似をして、番組を録画してから一定の期間が過ぎたら自動的に録画データを削除する bash シェル スクリプト を作ってみました。

#!/bin/bash                     ←スクリプト用シェルの宣言
if !( smbstatus -L | grep /REGZA/ > /dev/null );  1.REGZAのアクセス判定
then

cd /REGZA/trush/保存フォルダ/ &&
 mv -f *.dtv ../../save/
 mv -f *.dtv.rat ../../save/
 mv -f *.dtv.meta ../../save/           2.データ保護ルーチン

cd /REGZA/rec/保存フォルダ/ &&
 mv -f *.dtv ../../save/
 mv -f *.dtv.rat ../../save/
 mv -f *.dtv.meta ../../save/           2.データ保護ルーチン

cd /REGZA/rec/ &&
 for fname1 in $(find . -type f -maxdepth 1 -name "*.dtv" -mtime +7 | cut -b3-31)
 do
 mv -f $fname1.* ../trush/
 done                       3.期限切れデータの移動ルーチン

cd /REGZA/trush/ &&
 for fname2 in $(find . -type f -maxdepth 1 -name "*.dtv" -mtime +14 | cut -b3-31)
 do
 mv $fname2.* ../del_temp/
 done                       4.削除データの一時移動ルーチン

rm -fv ../del_temp/*.dtv
rm -f ../del_temp/*.dtv.rat
rm -f ../del_temp/*.dtv.meta                5.録画データを削除する
fi

一定期間が経過したら録画データを消去するスクリプト"video_move.sh"

このスクリプトを利用するにあたっては "/REGZA/" の下には録画用共有ポイントの "rec/" 以外に "trush/"(ゴミ箱) "save/"(保存用) という二つの共有ポイントを作成し、REGZA Z2000に録画機器として登録します。もちろん所有者、所有グループは共に "nobody" パーミッション "755" です。

ちなみにREGZA Z2000は共有ポイントを8つまで登録できます。

REGZA Z2000に録画機器を追加登録
REGZA Z2000に録画機器を追加登録

更に "rec/" "trush/" の下にはそれぞれ "保存フォルダ/" というディレクトリを作成しておきます。

スクリプトvideo_move.shを利用するためのディレクトリ構成
スクリプト"video_move.sh"を利用するためのディレクトリ構成

"trush" は、録画用共有ポイント "rec" に保存された録画データが一週間経過したときに、このスクリプトによって自動的に移動されられる場所です。

"Galileo" の場合は録画リストで常に 消去されるまでの残り日数 が表示されるのでこういう姑息なことはしなくて良かったのですが...。

最初は「一週間経ったらいきなり消去しちゃえ!。」というスクリプトにしていたのですが、番組が何の前触れもなく突然消えてしまうのはちょっと具合が悪いので "trush"(ゴミ箱) に一時的に退避させておいて更に一週間後に消去されるように工夫したわけです。

"save" は消去されたくない録画データを入れておく場所です。

REGZA Z2000では、録画した番組ごとに "ロック" をかけることができるようになっていますが、それは録画ファイルの パーミッション の変更などで対応しているのではなく、REGZA Z2000が内部的に「簡単な操作では消させんゾー。」みたいなフラッグを立てているだけですので、ファイルごと削除されたらこのロックは何の役にも立ちません。で、

「レグザリモコンの操作だけで録画ファイルの自動消去処理の対象外にすることはできないか?。」

と考えたわけですが、レグザリモコンが録画データに対してできるアクションといえば、その "ロック" 以外には 録画データのフォルダ(ディレクトリ)移動 しかないので、この ”移動” 仕組みを利用するわけです。

つまり保存版にしたい録画データはレグザリモコンの操作で "rec/" の一つ下の "保存フォルダ/" という救済用ディレクトリに移動しておくことで、自動消去スクリプトの魔の手から逃れられるようになる、という寸法です。

REGZA Z2000のリモコン操作では異なる共有ポイント間での録画データの移動ができない仕様になっていますので、こんな面倒なことをしなくちゃならないわけです。

ということは当然 "trush/" にも同じく救済用ディレクトリ "保存フォルダ/" を設けなければならないことになりますが、そうすると保存フォルダが二つになってしまうため「あれっ、あの番組はどっちに保存してたっけ?。」ということになってしまって混乱の元になります。

そこでこの二つの "保存フォルダ/" にそれぞれ移動された録画データを、自動的にまとめて別の共有ポイント "save/" に移動することにしたわけです。

"del_temp/" は録画データの消去のためのテンポラリ用のディレクトリで、 "trush/" ディレクトリに移動してから一週間(つまり録画してから二週間)経過した録画データはいったんここに移動した後に rm で消去されるようになっています。

「そんな回りくどいことしないで、 "trush" ディレクトリの中の録画データを直接消しちゃえばいいじゃん?。」

と思われる方はちょっと読みが浅いです。

LinuxOS ext3 ファイルシステムでは、ファイルの消去時にもデータの信頼性を高めるための処理を色々行うため、大きなファイルを削除するときには結構な時間がかかります。

例えばREGZA Z2000の録画データは一時間の地デジ番組で6 GB くらいにはなりますが、これを消去するのにも十秒程度はかかりますから、年末の特番なんかだと一分近くかかるかもしれません。

通常こういったスクリプトを実行するときは、例えばスクリプトの実行が完了するまではREGZA Z2000がアクセスできないようにSambaを止めるなり、パーミッションを一時的に変更しておくなりするのでしょうけどね。
しかし今回のケースでは、そうやってしまうと録画データの削除が完了するまでの間に録画予約されている番組は録画できないことになっていまいます。
うーん難しい。

ということは "trush/" ディレクトリ内のデータを直接削除するようなスクリプトを組んでしまうと、スクリプトの実行開始後に誰かがREGZA Z2000でビデオを見始めたり、予約していた録画が始まったりしたときにはまだ "trush/" ディレクトリ内の録画データの消去作業が終わっていない可能性が高いわけで、下手をすると削除中の録画データにREGZA Z2000がアクセスしてしまう可能性があります。そうなると何が起こるかわかりません。

これでは非常にマズイわけですね。

一方このスクリプトで実行されるファイルの「ディレクトリ間の移動」は、あくまで 一つのパーティション の中で行われるわけですから、どんなにファイルが大きかろうと「一瞬」で完了します。

つまり削除すべき録画データを「移動」という手段で瞬間的にREGZA Z2000の手の届かないディレクトリにワープさせておいて、それからゆっくりと削除処理を行うようにすれば安心、ということです。

というわけでこの "del_temp/" Samba の共有ポイントにはせず、単純に所有者及び所有グループを "root" パーミッション "755" としておきます。

以下、スクリプト内容の説明です。

1.REGZA Z2000の録画・再生中を判定する

1. はREGZA Z2000含む誰かが "web0.obenri.com" のディレクトリ "/REGZA/" 以下にアクセスしているかどうかをチェックする部分です。

if !( smbstatus -L | grep /REGZA/ > /dev/null );  1.REGZAのアクセス判定
then
.
.
.
fi

Samba で誰かがアクセスしているファイルは他のユーザーが書き換えできないように ロック されるようになっていて、 "smbstatus -L" を実行すると、そのロックファイルのリストを見ることができます。

[root@web0 ~]# smbstatus -LEnter
Locked files:
Pid  DenyMode  Access   R/W    Oplock      Name
--------------------------------------------------------------
13900 DENY_NONE 0x1     RDONLY   NONE       /REGZA/rec/M0578009e20
0712300015b791753d.dtv  Sun Dec 30 17:17:51 2007

[root@web0 ~]#

つまりこの "smbstatus -L" を実行したときに "/REGZA/" 標準出力 されるときには、誰か(何か)がディレクトリ "/REGZA/" 以下のファイルにアクセスしているということになります。

しかし実際のところはこのディレクトリ "/REGZA/" は録画専用の共有ポイントですので、この出力結果は 「REGZA Z2000が共有ポイント以下のデータに対して録画か再生を行っている。」 という判定に利用できるわけです。

具体的には grep コマンド に対して "smbstatus -L" からの出力をパイプ処理 コマンドのパイプ処理について で流し、出力内容に "/REGZA/" が含まれているかどうかを判定しますが、このとき出力結果があれば 「真」 、出力結果がなければ 「偽」 が返りますから、ここで "if" による条件分岐を行っているわけです。

ただしここでは「結果が真の場合はREGZA Z2000がアクセスしているのでスクリプトの実行を中止。」という処理を行う必要があるので、条件式に "!" を付けて「真」と「偽」の結果を逆転させています。

ちなみに "> /dev/null" は標準出力を抑制するためのものです。

このスクリプトは crond で実行させるのが前提です

crondで実行させるスクリプトやコマンドが何かを標準出力すると、その内容は "root" 宛てにメールされてしまいますから、このままではスクリプトを実行したときに "smbstatus | grep /REGZA/" の内容をメールしてくれることになります。

もちろんそんな結果をメールでもらっても仕方ないので標準出力そのものを抑制しているわけです。

2.自動削除したくない録画データを退避する

2. "保存フォルダ/" 以下の録画データを "save/" 以下に移動するためのルーチンです。

cd /REGZA/trush/保存フォルダ/ &&
 mv -f *.dtv ../../save/
 mv -f *.dtv.rat ../../save/
 mv -f *.dtv.meta ../../save/         2.データ保護ルーチン

cd /REGZA/rec/保存フォルダ/ &&
 mv -f *.dtv ../../save/
 mv -f *.dtv.rat ../../save/
 mv -f *.dtv.meta ../../save/         2.データ保護ルーチン

ここは単純に cd コマンド カレント ディレクトリを "保存フォルダ/" に移動し、 mv コマンドで録画データを移動するだけです。

cdコマンドの行末に "&&" を付けているのは、cdコマンドが実行できないときにこの スクリプト を強制終了させるためのものです。

mvコマンドに "-f" オプションを付けているのは、移動するファイルが存在しないときにエラーを出させないようにするためです。

3.録画して一週間経った番組を"trush/"に移動

この スクリプト キモ 3. 部分です。

cd /REGZA/rec/ &&
 for fname1 in $(find . -type f -maxdepth 1 -name "*.dtv" -mtime +7 | cut -b3-31)
 do
 mv -f $fname1.* ../trush/
 done                       3.期限切れデータの移動ルーチン

まず cd コマンド で録画用共有ポイント "/REGZA/rec/" に移動します。

ちなみにここで "*.dtv.rat" に対して検索を行うと録画終了時刻を基準に、 "*.dtv.meta" に対して検索を行うと最終視聴時刻を基準にすることができます。

次に find コマンドで録画開始時刻から一週間以上経った録画データのファイル名を録画データのメインファイル "*.dtv" REGZA Z2000の録画データファイルについて から取得しつつ、 "for" 文を使って "*." の部分を 変数"$fname1" に格納します。

fileコマンドの各オプションは、

-type f :対象をファイルに限定(ディレクトリやリンクを含めない)

-maxdepth 1 :そのディレクトリ階層のみを検索対象に(下の階層を含めない)

-name "*.dtv" :ファイル名"*.dtv"を検索対象にする

-mtime +7 :現在時刻から7日以上経過したファイルを検索対象にする

となります。

この場合findコマンドの出力結果は "./[29文字のファイル名].dtv" となりますから、そのまま パイプ処理 コマンドのパイプ処理について cut コマンドに処理を渡します。

cutコマンドはこのように "cut -b3-31 と指定すると、受け取った テキスト データの各行に対して 3バイト目から31バイト目までを 標準出力 します から、出力結果は先頭の "./" ".dtv" が取り除かれた 29文字の録画ファイル名 が出力され、 変数"$fname1" に入力されることになるわけです。

そしてその変数を使って mv コマンドで "$fname1.dtv" "$fname1.dtv.rat" "$fname1.dtv.meta" の三つのファイルをセットで "../trush/" 、つまり "/REGZA/trush/" に移動するわけです。

4."trush/"に移動した番組を一週間後に"del_temp/"に移動

4. は基本的には 3. と同じです。

違うのは対象になるディレクトリが "/REGZA/trush/" であることと、 find コマンド の日数オプションが "-mtime +14" で「二週間」になっていることと、録画データの移動先が "/REGZA/del_temp/" になっている点です。

cd /REGZA/trush/ &&
 for fname2 in $(find . -type f -maxdepth 1 -name "*.dtv" -mtime +14 | cut -b3-31)
 do
 mv $fname2.* ../del_temp/
 done                       4.削除データの一時移動ルーチン

このルーチンで録画から二週間経過した番組データを、REGZA Z200からはアクセスできない "/REGZA/del_temp/" に移動させてしまうわけです。

5.番組データの削除

詳しい説明は不要でしょう。 "del_temp/" 以下のファイルをすべて削除します。

rm -fv ../del_temp/*.dtv
rm -f ../del_temp/*.dtv.rat
rm -f ../del_temp/*.dtv.meta                5.録画データを削除する
fi

最初の行の mv コマンド のオプションだけが "-fv" になっているのは実際に削除された "*.dtv" の内容を出力したいからです。

このオプションを設定しておくと、 crond でこの スクリプト が実行されたとき、削除した録画データがあったとき管理者宛に

/etc/cron.video/video_move.sh:

removed `../del_temp/M01980053200712040015b791753d.dtv'

という内容のメールが送られてくるようになります。

このページの先頭へ↑

操作が面倒なわりに使いでのないスクリプトで...

作成した シェル スクリプト "video_move.sh" というファイル名で保存しました。

このスクリプトは "root" でのみ実行しますから、所有者と所有グループを "root" にして chmod コマンド パーミッション "700" にしました。

そして "/etc/cron.daily/" に放り込んで終了です。

このスクリプトが稼動し始めると、REGZA Z2000で "REC(WEB0)" に録画した番組は一週間後には "TRUSH(WEB0)" に自動的に移動し、更に一週間経つと削除されるようになります。

そして消されたくない番組はレグザリモコンを使って "保存フォルダ" に移動しておくことで、しばらくすると "SAVE(WEB0)" に自動的に移動し、保存版とすることができます。

REGZA Z2000に録画機器構成
REGZA Z2000に録画機器構成

と、自分ではそれなりに良いできだと思いましたが、家族には 大不評 でした。

スクリプトを作った本人は仕組みが解っているのでなんてことはないのですが、

「保存フォルダに入れておくとそのうちSAVEに移動する。」とか、「一週間経ったらTRUSHに移動して、もう一週間たったら消去される。」とか説明しても、

「で、結局どうしたらいいの?。」

ということらしいのです。確かに客観的にみてシンプルとはいえない仕組みになっています。これは。

お便利サーバー.com管理人は、スクリプトの仕組みだけを考えるあまり、実際にそれを利用するのが素人と子供であることを忘れてたわけですね。

で、このスクリプトは稼動からわずか二週間でボツになりましたとさ。

このサイトは既に更新を終了していますが、今のところ店じまいの予定はありません。 リンクフリー ですので、趣味や勉強のためでしたら、引用、転用、コピー、朗読、その他OKです。このサイトへのリンクについては こちら をご覧ください。
Powered by Apache
”Linux”は、Linus Torvalds 氏の各国における登録商標です。”Red Hat”及びRed Hatのロゴおよび Red Hat をベースとしたすべての商標とロゴは、各国におけるRed Hat, Inc. 社の商標または登録商標です。その他のプログラム名、システム名、製品名などは各メーカー、ベンダの各国における登録商標又は商標です。
www.centos.org - The Community ENTerprise Operating System