Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

Watchmanとは?Linuxでファイル・ディレクトリの変更を効率的に監視する方法

Watchmanは、Facebookが開発したオープンソースのクロスプラットフォーム対応ファイル監視サービスです。ファイルやディレクトリの変更を監視し、変更が発生した際に記録やアクションを実行できます。Linux、OS X、FreeBSD、Solarisで動作し、クライアントサーバーモデルを採用している点が特徴です。また、Linuxカーネルのinotify機能を利用することで、強力かつ高精度な通知を実現しています。

Watchmanの主な特徴

  • 1つ以上のディレクトリツリーを再帰的に監視できる
  • 監視対象の各ディレクトリは「root(ルート)」と呼ばれる
  • コマンドラインまたはJSON形式の設定ファイルで構成可能
  • 変更内容をログファイルに記録する
  • root内で発生するファイル変更のサブスクリプション(購読)に対応
  • 前回確認時以降のファイル変更履歴や、ツリーの現在の状態をクエリできる
  • プロジェクト全体をまとめて監視できる

本記事では、Linux環境にwatchmanをインストールし、ファイルの変更を監視・記録する方法を解説します。さらに、ディレクトリの変更を検知してスクリプトを自動実行する方法についても簡単に紹介します。

LinuxへのWatchmanのインストール

watchmanはソースコードからビルドしてインストールします。まず、以下のコマンドで必要な依存パッケージ(libssl-devautoconfautomakelibtoolsetuptoolspython-devellibfollyなど)をインストールしてください。

----------- Debian/Ubuntuの場合 -----------
$ sudo apt install autoconf automake build-essential python-setuptools python-dev libssl-dev libtool 
----------- RHEL/CentOSの場合 -----------
# yum install autoconf automake python-setuptools python-devel openssl-devel libssl-devel libtool 
# yum groupinstall 'Development Tools' 
----------- Fedoraの場合 -----------
$ sudo dnf install autoconf automake python-setuptools openssl-devel libssl-devel libtool 
$ sudo dnf groupinstall 'Development Tools'

依存パッケージのインストールが完了したら、GitHubリポジトリからソースコードをクローンし、configure、ビルド、インストールの順に進めます。

$ git clone https://github.com/facebook/watchman.git
$ cd watchman
$ git checkout v4.9.0 
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

Watchmanでファイルとディレクトリを監視する

Watchmanの設定方法は主に2通りあります。(1)デーモンがバックグラウンドで動作中にコマンドラインから設定する方法と、(2)JSON形式の設定ファイルを使用する方法です。

ディレクトリ(例:~/bin)の変更を監視するには、以下のコマンドを実行します。

$ watchman watch ~/bin/
Watchmanとは?Linuxでファイル・ディレクトリの変更を効率的に監視する方法

このコマンドを実行すると、/usr/local/var/run/watchman/<ユーザー名>-state/配下に、JSON形式の設定ファイルstateと、ログファイルlogが作成されます。

これらのファイルはcatコマンドで内容を確認できます。

$ cat /usr/local/var/run/watchman/aaronkilik-state/state
$ cat /usr/local/var/run/watchman/aaronkilik-state/log

トリガーの設定方法

監視対象ディレクトリに変更があった際に実行するアクションを定義することもできます。以下のコマンドでは、「test-trigger」という名前のトリガーを作成し、監視中のディレクトリで変更が検知されると~/bin/pav.shスクリプトが自動的に実行されるように設定しています。

テスト用として、ここではpav.shスクリプトが、スクリプトと同じディレクトリ内にタイムスタンプ付きのファイル(例:file.$time.txt)を作成するだけのシンプルな処理を行うものとします。

time=`date +%Y-%m-%d.%H:%M:%S`
touch file.$time.txt

ファイルを保存したら、スクリプトに実行権限を付与します。

$ chmod +x ~/bin/pav.sh

トリガーを起動するには、以下のコマンドを実行します。

$ watchman -- trigger ~/bin 'test-trigger' -- ~/bin/pav.sh
Watchmanとは?Linuxでファイル・ディレクトリの変更を効率的に監視する方法

監視状態とトリガーの確認

watchmanでディレクトリを監視すると、そのディレクトリは監視リストに追加されます。監視リストを確認するには、以下のコマンドを実行します。

$ watchman watch-list 
Watchmanとは?Linuxでファイル・ディレクトリの変更を効率的に監視する方法

特定のrootに登録されたトリガーリストを表示するには、以下のコマンドを実行します(~/binは実際のroot名に置き換えてください)。

$ watchman trigger-list ~/bin
Watchmanとは?Linuxでファイル・ディレクトリの変更を効率的に監視する方法

上記の設定により、~/binディレクトリに変更があるたびに、file.2019-03-13.23:14:17.txtのようなタイムスタンプ付きファイルがディレクトリ内に自動生成されます。lsコマンドで結果を確認してみましょう。

$ ls
Watchmanとは?Linuxでファイル・ディレクトリの変更を効率的に監視する方法

LinuxからWatchmanをアンインストールする

watchmanをアンインストールしたい場合は、ソースディレクトリに移動して以下のコマンドを順に実行します。

$ sudo make uninstall
$ cd '/usr/local/bin' && rm -f watchman 
$ cd '/usr/local/share/doc/watchman-4.9.0 ' && rm -f README.markdown 

より詳細な情報については、Watchmanの公式GitHubリポジトリ(https://github.com/facebook/watchman)をご覧ください。

関連記事

  1. Swatchdog – Linuxでログファイルをリアルタイム監視するシンプルなツール
  2. ログファイルをリアルタイムで監視・確認する4つの方法
  3. fswatch – Linuxでファイル・ディレクトリの変更を監視する
  4. Pyintify – Linuxでファイルシステムの変更をリアルタイム監視する
  5. Inav – LinuxでApacheログをリアルタイム監視する

Watchmanは、ファイルの変更を監視して記録したり、変更を検知してアクションを自動実行したりできるオープンソースのファイル監視サービスです。ご質問やご意見があれば、ぜひフィードバックフォームからお寄せください。

  1. Linuxのwatchコマンドの使い方と実用例をわかりやすく解説

    Linuxのwatchコマンドは、指定したコマンドを一定間隔で繰り返し実行し、その結果を画面に表示し続けるためのツールです。コマンドの出力が時間とともにどう変化するかをリアルタイムで監視したい場合に非常に便利です。この記事では、watchコマンドの基本的な使い方と、覚えておくと役立つ実用的な例を紹介します。 watchコマンドの基本構文 watchコマンドの構文は以下のとおりです。 watch オプション コマンド 各要素の意味は次のとおりです。 オプション: 後述の表から選択したオプションを指定します。watchコマンドのデフォルト動作を変更できます。 コマンド: watchが繰り返し実行

  2. Linuxでネットワーク・ディスク使用量・稼働時間・負荷平均・RAM使用量を一括監視できるシェルスクリプト

    システム管理者の業務は非常に多岐にわたります。サーバーの監視、ユーザー管理、ログの確認、バックアップの作成など、日々繰り返されるタスクは数多くあります。こうした反復作業を効率化するため、多くの管理者がスクリプトを作成して自動化しています。 本記事で紹介するシェルスクリプトは、典型的なシステム管理業務そのものを自動化することを目的としたものではありませんが、特にLinux初心者にとって、システム、ネットワーク、ユーザー、負荷、RAM、ホスト名、内部IP、外部IP、稼働時間など、必要な情報を一括して取得できる便利なツールです。 出力の整形にも一定の配慮がされており、スクリプトには悪意のあるコードは