web-dev-qa-db-ja.com

dnotify / inotifyコマンドを使用してディレクトリを継続的に監視する方法

Dnotify/inotifyコマンドは初めてです。ディレクトリを継続的に監視し、何らかの変更または修正があることを示すようなスクリプトの作成方法を教えてください。

32
sai sindhu

Inotify自体は、たとえばからの呼び出しを介してアクセス可能なカーネルモジュールです。 Cプログラム。 http://www.ibm.com/developerworks/linux/library/l-ubuntu-inotify/

Inotify-toolsと呼ばれるアプリケーションスイートがあります。

inotifywait-inotifyを使用してファイルの変更を待つ

http://linux.die.net/man/1/inotifywait

そして

inotifywatch-inotifyを使用してファイルシステムのアクセス統計を収集する

http://linux.die.net/man/1/inotifywatch

コマンドラインから直接inotifyを使用できます。このように、ホームディレクトリ下のすべての変更を継続的に監視します(大量の出力が生成される場合があります)

inotifywait -r -m $HOME

そして、これは継続的に監視し、inotifywaitのmanファイルからコピーされたApacheログアクティビティに反応するスクリプトです。

#!/bin/sh
while inotifywait -e modify /var/log/messages; do
  if tail -n1 /var/log/messages | grep httpd; then
    kdialog --msgbox "Apache needs love!"
  fi
done
29
thnee

以下は、個々のファイルの操作を確認するために使用するものです。 「-m」を指定すると、1つのイベントの後に監視と終了が発生します。タイムスタンプを取得するには、少なくとも3.13バージョンのinotify-toolsが必要ですが、それが重要でない場合(またはOSで利用できない場合や更新が難しい場合)、timefmtおよびformatオプションをスキップできます。別のシェルで「cat /etc/resolv.conf」を実行すると、次の結果が得られます。

$ inotifywait -m --timefmt '%H:%M' --format '%T %w %e %f' /etc/resolv.conf

Setting up watches.  
Watches established.
12:49 /etc/resolv.conf OPEN 
12:49 /etc/resolv.conf ACCESS 
12:49 /etc/resolv.conf CLOSE_NOWRITE,CLOSE 

inotifywaitにはディレクトリを監視するオプションもあるため、マンページを確認してください。再帰的に-rを追加して、ディレクトリの子を監視します。

「->」プレフィックスを使用して表示された別のウィンドウに入力したコマンドの例を次に示します。

$ inotifywait -mr --timefmt '%H:%M' --format '%T %w %e %f' /home/acarwile/tmpdir
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.

-> cd into directory, no info
-> ls in directory
13:15 /home/acarwile/tmpdir/ OPEN,ISDIR 
13:15 /home/acarwile/tmpdir/ CLOSE_NOWRITE,CLOSE,ISDIR 

-> touch newfile
13:16 /home/acarwile/tmpdir/ CREATE newfile
13:16 /home/acarwile/tmpdir/ OPEN newfile
13:16 /home/acarwile/tmpdir/ ATTRIB newfile
13:16 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE newfile

-> mv newfile renamedfile
13:16 /home/acarwile/tmpdir/ MOVED_FROM newfile
13:16 /home/acarwile/tmpdir/ MOVED_TO renamedfile

-> echo hello >renamedfile
13:16 /home/acarwile/tmpdir/ MODIFY renamedfile
13:16 /home/acarwile/tmpdir/ OPEN renamedfile
13:16 /home/acarwile/tmpdir/ MODIFY renamedfile
13:16 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE renamedfile

-> touch renamedfile
13:17 /home/acarwile/tmpdir/ OPEN renamedfile
13:17 /home/acarwile/tmpdir/ ATTRIB renamedfile
13:17 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE renamedfile

-> rm renamedfile
13:17 /home/acarwile/tmpdir/ DELETE renamedfile

-> cd ..; rmdir tmpdir
13:17 /home/acarwile/tmpdir/ DELETE_SELF 

上記の後、私はtmpdir( "mkdir tmpdir")を作り直そうとしましたが、そこから出力は得られませんでした。新しいtmpdirは、古いtmpdirと同じディレクトリではありません。ちょうど^ Cになってitnotifywaitを停止する時間です。

12
Alan Carwile

https://superuser.com/a/747574/28782 で述べたように、直接の一部を使用せずにinotifywaitを使用するヘルパースクリプトを作成しました制限: inotifyexec

使用例(システムパスに実行可能ファイルとして追加した場合):

inotifyexec "echo test" -r .
4
Wernight