
|
[バックナンバーのトップへ] [Linux システム管理のトップへ] いますぐ実践! Linux システム管理 / Vol.157 / 読者数:1310名こんばんは、うすだです。 唐突ですが、スラッシュドットに、 日本のWebブラウザのシェアに関する記事が載っていました。
IEの独占状態が崩れつつある国内Webブラウザシェア 調査した会社の発表資料を見てみますと、ブラウザのシェアだけでなく、 OS や画面サイズなどのシェアの調査結果も記載されており、 いろいろと個人的に面白いと思うところがありました。
わたしは、ここ数年はずっと XGA サイズを使ってきましたが、 公開している壁紙は、SXGA サイズも用意した方がよいかも、と思いました。 技術者なのに、一番のツボが画面サイズだったことに、われながら驚愕をしつつも、 はりきってまいりたいと思います。 今回のお題 - inotify でディレクトリを監視してみる前回は、dnotify を使って、ディレクトリの監視を行いました。
Vol.156 - dnotify でディレクトリを監視する
ファイルができたりなくなったり変更されたりすると、
即座に通知されるのは便利だなあ、というお話でした。
さて、時は流れまして、Linux カーネル 2.6.13 で、
新たに inotify という監視機構が組み込まれました。
inotify を使えば、もう少し楽に、かつ詳細な監視ができそうですね。
まずは、inotify を利用するためのツールをインストールしましょう。
幸い、Fedora や Ubuntu, Debian など、主要なディストリビューションには、
inotify-tools のパッケージが存在します。 # yum install inotify-tools (RedHat 系の場合) # apt-get install inotify-tools (Debian 系の場合)
残念ながら、わたしが普段使っている Vine や CentOS には、
パッケージが見当たりません。
inotify-tools
ただし、ソース・アーカイブには SPEC ファイルが含まれません。 これらを所定の位置に置いて、rpmbuild コマンドを実行すれば、 なんの問題もなくパッケージが作成されました。 $ mv inotify-tools-3.13.tar.gz ~/rpmbuild/SOURCES/ $ mv inotify-tools.spec ~/rpmbuild/SPECS/ $ rpmbuild -bb ~/rpmbuild/SPECS/inotify-tools.spec $ sudo rpm -i ~/rpmbuild/RPMS/i386/inotify-tools-3.13-1.i386.rpm
ただ、某レンタルサーバで使用している CentOS では、
パッケージ作成中にテストでコケてしまいました。 さて、inotify-tools パッケージをインストールしますと、 inotifywait と inotifywatch というコマンドが使えるようになります。
inotifywait は、指定したファイルやディレクトリに変化があると、
その旨出力してくれるコマンドです。 今回目標とするのは、ディレクトリを監視して、 なにか操作されたらすぐ通知してもらうことです。ですので、以降では、 inotifywait コマンドを使って、目標に近付いていきたいと思います。
早速、inotifywait コマンドを使ってみたいと思います。 まず、/tmp/test というディレクトリを作成し、 /tmp/test を指定して inotifywait コマンドを実行してみます。 $ mkdir /tmp/test $ inotifywait /tmp/test Setting up watches. Watches established. フォアグラウンドで実行中になりますので、別の端末から、 /tmp/test/a というファイルを作ってみましょう。 $ touch /tmp/test/a すると、inotifywait コマンドを実行中の端末に、以下が実行されます。 /tmp/test/ CREATE a $
ただし、一発来たところで、inotifywait が終了してしまいます。 $ inotifywait -m /tmp/test ... /tmp/test/ CREATE a /tmp/test/ OPEN a /tmp/test/ ATTRIB a /tmp/test/ CLOSE_WRITE,CLOSE a
ただ、デフォルトでは、すべての操作を対象とします。 $ inotifywait -m -e create,delete,modify,move /tmp/test 試しに、別の端末から、ファイルを削除してみましょう。 $ rm /tmp/test/a すると、以下だけが出力されます。 /tmp/test/ DELETE a また、ファイルを作成してファイル名を変更してみます。 $ touch /tmp/test/a && mv /tmp/test/a /tmp/test/b すると、以下のように出力されます。 /tmp/test/ CREATE a /tmp/test/ MOVED_FROM a /tmp/test/ MOVED_TO b
ちなみに、パーミッションや時刻情報等の属性は監視していませんので、
chmod コマンドなどで変更しても、なにも出力されません。 $ chmod 444 /tmp/test/b それから、あるディレクトリ以下すべてを対象としたい場合は、 dnotify コマンドと同様、-r オプションを指定します。 $ inotifywait -mr /tmp/test Setting up watches. Beware: since -r was given, this may take \ a while! Watches established. 他に、出力フォーマットを変更する、--format や -c というオプションもあります。 …が、ここでは割愛させていただきます。 inotifywait コマンドの使いかたがわかったところで、次に、 監視の自動化を試みたいと思います。 早速ですが、以下のスクリプトを作成してみました。
#!/bin/sh
/usr/bin/inotifywait -e create,delete,modify,move,attrib \
-mrq /etc | while read line; do
path=`echo $line | /usr/bin/awk '{print $1}'`
echo $line | /usr/bin/Mail -s "[notice] $path" $USER
done
/etc を監視し、inotifywait がなにか出力したら、
それをメールで通知するためのスクリプトです。 # chmod 700 /usr/local/sbin/inotify.sh # /usr/local/sbin/inotify.sh
すると、何か操作が行われると、メールが送られてきます。 ですので、ちょっと改良を加えてみました。
#!/bin/sh
NOTIFYPATH=/etc
TIMEOUT=5
MAILTO=root
/usr/bin/inotifywait -e modify,attrib,create,delete \
-mrq $NOTIFYPATH | while [ 1 ]; do
messages=""
while read -t $TIMEOUT line; do
messages="${messages}$line@RET@"
done
if [ -n "$messages" ]; then
echo $messages | sed 's/@RET@/\n/g' | \
/usr/bin/Mail -s "[notice] $NOTIFYPATH" $MAILTO
fi
done
TIMEOUT で指定した秒数(上記では 5秒)分をまとめて、 ひとつのメールで送るようにしてみました。 たとえば、以下を実行して、/etc/X11/foo を1秒だけ存在させてみます。 # touch /etc/X11/foo; sleep 1; rm -f /etc/X11/foo
すると、以下の内容のメールが、1通だけ送られてきます。 /etc/X11/ CREATE foo /etc/X11/ ATTRIB foo /etc/X11/ DELETE foo
これなら、実用に堪えられそうです。 以上、inotify でディレクトリを監視する方法を、ご紹介しました。 inotify や dnotify の詳細を理解したいと思われた貴兄は、 以下などを参照してください。
http://www.linux.or.jp/JM/html/LDP_man-pages/man7/inotify.7.html 自分でプログラムを作成しなくても、機能の詳細を確認し、 ツールの中で何が行われているかを推測することは、大事なことだと思います。 あわよくば、スクリプトなどを自分で作成して、 inotify や dnotify を活用していただければと思います。(ぜひ、実践してください!) 宿題の答え前回の宿題は、 dnotify で監視していることを気づかれないよう細工してみましょう。 でした。 前回、init を使って、自動かつ繰り返し実行させましたが、ps コマンドで見ると、 dnotify で監視していることがバレバレでした。
$ ps ax | grep dnotify
13939 ? Ss 0:00 /usr/bin/dnotify -CDMRBr /etc -e \
/usr/local/sbin/dirnotify.sh {}
...
では、実行するもの全体をシェルスクリプトにしてしまえば、隠蔽できるでしょうか。
#!/bin/sh
/usr/bin/dnotify -CDMRBr /etc -e /usr/local/sbin/dirnotify.sh {}
これを、たとえば /usr/local/sbin/notify.sh という名前にして (実際はもっとわかりにくい名前すべきだと思いますが)、 # chmod 700 /usr/local/sbin/notify.sh /etc/inittab の、前回追加した行をコメントアウトし、あらためて以下を追加します。 dn:235:respawn:/usr/local/sbin/notify.sh そして、以下の手順で、init さんにお知らせします。 # kill -HUP 1 # kill <dnotifyのPID>
しかしながら、ps コマンドで確認すると、ばっちり出てきます。
$ ps ax | grep dnotify
19974 ? S 0:00 /usr/bin/dnotify -CDMRBr /etc -e \
/usr/local/sbin/dirnotify.sh {}
...
それでは、dnotify コマンドをコピーして、違う名前にしてみましょう。 # cp /usr/bin/dnotify /usr/local/sbin/yfitond # chmod 500 /usr/local/sbin/yfitond 上記のようにコピーして、先ほどの notify.sh を以下に変更します。
#!/bin/sh
/usr/local/sbin/yfitond -CDMRBr /etc -e /usr/local/sbin/dirnotify.sh {}
そして、notify.sh を kill しますと… # kill <notify.shのPID> # ps ax | grep dnotify ...
一応見えなくなりました。
$ ps axw
...
21110 ? Ss 0:00 /bin/sh /usr/local/sbin/notify.sh
21111 ? S 0:00 /usr/local/sbin/yfitond -CDMRBr /etc -e \
/usr/local/sbin/dirnotify.sh {}
...
…ああ、オプションの指定が、dnotify の風貌のままです。
しかし、うっかり宿題にしてしまった以上、これでは引き下がれません。
で、ここからは、模範解答ほど遠い内容になっております。 さて、まず、以下からパッチを得ます。(即席で作りました。) http://www.usupi.org/sysad/157_dnotify_intiki_patch.txt
このパッチを当てますと、引数を与えても与えなくても、
上記オプションがそのまま渡されるようになります。 $ cd ~/rpmbuild/BUILD/dnotify-0.18.0/src $ patch -p0 < ~/157_dnotify_intiki_patch.txt $ make コンパイルとリンクが通ったら、/usr/local/sbin/yfitond2 という名前でコピーします。 # cp dnotify /usr/local/sbin/yfitond2 # chmod 500 /usr/local/sbin/yfitond2 そして、notify.sh を以下のようにします。(さっぱりしますね!) #!/bin/sh /usr/local/sbin/yfitond2 すると、あからさまなオプションが見えなくなりました。 $ ps axw ... 21425 ? Ss 0:00 /bin/sh /usr/local/sbin/notify.sh 21426 ? S 0:00 /usr/local/sbin/yfitond2 ...
これで解決なのか、という疑問を拭いされていない気もしますが、一応、
目的地にはたどり着いたということにして、終わりにしたいと思います。 今回の宿題今回の宿題は、 実体のないファイルシステムなどを inotifywait で監視するとどうなる か、試してみましょう。 です。 たとえば、procfs や sysfs など、 特殊なファイルシステム上のファイルやディレクトリを監視するとどうなるのか、 試してみてください。 あとがき日経新聞に、「時間割引率」に関する記事が、掲載されていました。
ある価値のモノを、いま受け取るのと将来受け取るのとでは、当然、
いま受け取るほうを選ぶと思いますが、
その価値が将来どのくらい下がるのかを示す率が、時間割引率だ…と思います。
この率は、ひとによっても、対象や状況によっても変わります。 また、太ったひとは、将来のスリムな体型を維持することより、 目の前にあるデザートを食べたいことを選びがちなため、 「時間割引率が高い」と言えると思います。 こんなふうに、時間割引率の考え方は、いろんなことに当てはまります。
さて、この間、わが子に、目先の欲望にとらわれすぎちゃいけないよ、
ということを説くのに、時間割引率の話をしてみました。
そんな中、ふと思ったことがあります。 同じような過ちを繰り返したときに、 「欲望にとらわれてはいけない」という話をくどくど言うよりも、 「時間割引率」とだけ言ったほうが、言うほうも楽ですし、 言われるほうもそのヒトコトだけで済みます。 時間割引率の本来の使いかたとはかけ離れているかもしれませんが、わが家的には、 この使いかたで、しばらくいってみようと思います。
今回も、ここまで読んでいただき、誠にありがとうございました。
「いますぐ実践! Linux システム管理」の解除は、以下からできます。
バックナンバーは、こちらにほぼ全部そろっています。
「栗日記」−低予算でなにかドカンとできないか…悩んでおります。 |
▼ トップ ▼ プロフィール ▼ リンク
▼ 作ってみました
▼ せんでん
▼ 最近読んだ本
▼ 気に入ってる本 |