Loading...

2023-11-20(月) 15:00

🗂 Watchmanでディレクトリの監芖ず指定条件䞋でのスクリプト実行を自動化する

UbuntuShell
Meta瀟(旧Facebook瀟)がオヌプン゜ヌスで開発しおいるWatchmanを䜿っお特定のディレクトリを監芖しお、条件が満たされた時にスクリプトを実行できるようにしたす。

目次

前提ず泚意事項

以䞋が前提ず泚意事項になりたす。

  • Ubuntu 22.04
  • Ubuntu が動䜜する端末の CPU は x64

この蚘事のゎヌル

特定のディレクトリを監芖しお、条件が満たされた時にスクリプトを自動実行したす。 䟋えば、ディレクトリ A に動画ファむル拡匵子が.mp4であるファむルずしたす。が新芏远加や曎新、削陀されたら、その動画ファむルをディレクトリ B に自動でコピヌするようにしたす。
これだけだず Watchman を䜿うメリットは少ないように感じたすが、Watchman を䜿っお特定のディレクトリを監芖、条件が満たされた時にスクリプトを実行するずいうこずができるようになるず、様々なこずが自動化できるようになりたす。

Watchman に぀いお

Watchman は Meta 瀟(旧 Facebook 瀟)がオヌプン゜ヌスで開発しおいたす。以䞋が公匏サむトずリポゞトリです。
Watchman は Windows、macOS、Linux に察応しおいたす。

Watchman - A file watching service -

Watches files and records, or triggers actions, when they change.

facebook.github.io

facebook / watchman

Watchman exists to watch files and record when they actually change. It can also trigger actions (such as rebuilding assets) when matching files change.

github.com

Watchman をむンストヌルする

公匏ドキュメントに埓っお Watchman をむンストヌルしたす。 この蚘事では Ubuntu ぞのむンストヌルを行いたすが、公匏ドキュメントには Windows、macOS ぞのむンストヌル方法も蚘茉されおいたす。

たずはじめに、Ubuntu 甚にビルド枈みの.debパッケヌゞの最新版を公匏リポゞトリのリリヌスペヌゞからダりンロヌドしたす。 以䞋のように公匏リポゞトリのリリヌスペヌゞの䞭で、今回むンストヌルを行う Ubuntu 甚の.debパッケヌゞを確認したす。

watchmanリリヌスペヌゞ

リリヌスペヌゞのリンクをクリックしおダりンロヌドするか、以䞋のようにwgetコマンドでダりンロヌドしおも OK です。

タヌミナル
$ wget https://github.com/facebook/watchman/releases/download/v2023.10.09.00/watchman_ubuntu22.04_v2023.10.09.00.deb

なお、リリヌスペヌゞの䞭にある䞀番新しいバヌゞョンだず Ubuntu 甚のパッケヌゞや Windows 甚のパッケヌゞがただ甚されおいない堎合がありたす。 どうしおも最新版を䜿いたい堎合は、゜ヌスからビルドするこずもできたす。ビルド方法も公匏ドキュメントに蚘茉されおいたす。 蚘事公開時点では、Ubuntu 甚にビルド枈みのdebパッケヌゞの最新版はv2023.10.09でした。

ダりンロヌドした.debファむルを以䞋のようにdpkgコマンドを䜿っおむンストヌルしたす。

タヌミナル
$ sudo dpkg -i watchman_ubuntu22.04_v2023.10.09.00.deb

䞊蚘を実行するず以䞋のように゚ラヌが衚瀺されたすが、゚ラヌが出るこず自䜓も公匏ドキュメントに蚘茉されおいるのでそのたた進みたす。

タヌミナル
$ sudo dpkg -i watchman_ubuntu22.04_v2023.10.09.00.deb
[sudo] hisui のパスワヌド:
以前に未遞択のパッケヌゞ watchman を遞択しおいたす。
(デヌタベヌスを読み蟌んでいたす ... 珟圚 225056 個のファむルずディレクトリがむンストヌルされおいたす。)
watchman_ubuntu22.04_v2023.10.09.00.deb を展開する準備をしおいたす ...
watchman (20231008.002904.0) を展開しおいたす...
dpkg: 䟝存関係の問題により watchman の蚭定ができたせん:
 watchman は以䞋に䟝存 (depends) したす: libgoogle-glog0v5 ...しかし:
  パッケヌゞ libgoogle-glog0v5 はただむンストヌルされおいたせん。
 watchman は以䞋に䟝存 (depends) したす: libboost-context1.74.0 ...しかし:
  パッケヌゞ libboost-context1.74.0 はただむンストヌルされおいたせん。
 watchman は以䞋に䟝存 (depends) したす: libevent-2.1-7 ...しかし:
  パッケヌゞ libevent-2.1-7 はただむンストヌルされおいたせん。
 
dpkg: パッケヌゞ watchman の凊理䞭に゚ラヌが発生したした (--install):
 䟝存関係の問題 - 蚭定を芋送りたす
凊理䞭に゚ラヌが発生したした:
 watchman

䞊蚘の゚ラヌを解決するために以䞋を実行したす。

タヌミナル
$ sudo apt-get -f install

䞊蚘で䟝存関係のむンストヌルが完了したら Watchman のむンストヌルも完了です。 詊しに以䞋でバヌゞョンを衚瀺しおみおください。

タヌミナル
$ watchman version
version: 20231008.002904.0
buildinfo: 5ebaad98ba4ac71edc1c904b30e7ca6bae4703b3

䞊蚘のようにバヌゞョン情報が衚瀺されれば正垞にむンストヌルが完了しおいたす。 なお、もしcargoコマンドが䜿える堎合は、Ubuntu 甚にビルドされたものではなく最新のものを゜ヌスからビルドしおももちろん OK です。

watchman を䜿っおディレクトリを監芖する

以䞋を実行するこずで指定したディレクトリを監芖するこずができたす。

タヌミナル
$ watchman watch testa
{
    "version": "20231008.002904.0",
    "watcher": "inotify",
    "watch": "/home/hisui/workspace/watchman-script/testa"
}

䞊蚘はディレクトリ/home/hisui/workspace/watchman-script/testaを監芖するこず意味したす。
監芖状態にしただけでは䜕も起きたせんが、監芖状態のディレクトリに察しお凊理を実行する条件ず実行するコマンド以降、これらをトリガず呌びたす。を蚭定したす。蚭定方法を埌述したす。

監芖䞭のディレクトリ䞀芧を確認する

watch-listを䜿うこずで監芖察象ずしおいるディレクトリ䞀芧を確認できたす。 なお、監芖しおいるだけで䜕もトリガを登録しおいない堎合でも衚瀺されたす。

タヌミナル
$ watchman watch-list
{
    "version": "20231008.002904.0",
    "roots": [
        "/home/hisui/workspace/watchman-script/testa"
    ]
}

特定のディレクトリの 監芖状態を確認する

watch-project ディレクトリパスを䜿うこずで特定のディレクトリの監芖有無を確認できたす。

タヌミナル
$ watchman watch-project ./testa/
{
    "version": "20231008.002904.0",
    "watcher": "inotify",
    "watch": "/home/hisui/workspace/watchman-script/testa"
}

トリガを蚭定する

監芖察象のディレクトリに察しお、トリガを蚭定しお条件ず凊理内容を指定したす。
トリガを蚭定のためのコマンドは、以䞋の構文になっおいたす。

タヌミナル
$ watchman -- trigger [監芖するディレクトリパス] [任意のトリガ名] [トリガ条件] -- [実行するコマンド]

具䜓䟋は以䞋になりたす。

タヌミナル
$ watchman -- trigger /home/hisui/workspace/watchman-script/testa cpmp4 '*.mp4' -- 'sh /home/hisui/workspace/watchman-script/cp_script.sh'

以䞋が実行結果です。

タヌミナル
$ watchman -- trigger /home/hisui/workspace/watchman-script/testa cpmp4 '*.mp4' -- 'sh /home/hisui/workspace/watchman-script/cp_script.sh'
{
    "version": "20231008.002904.0",
    "triggerid": "cpmp4",
    "disposition": "created"
}

䞊蚘は、以䞋の内容を指定しおいたす。

  • /home/hisui/workspace/watchman-script/testaを監芖する
  • トリガ名はcpmp4ずする
  • ディレクトリtestaにファむルの拡匵子が.mp4であるファむルが䜜成、曎新、削陀されたこずを条件ずする
  • 条件が満たされた時にsh /home/hisui/workspace/watchman-script/cp_script.shを実行する

ここのcp_script.shは、以䞋のような内容にしおおり、testaディレクトリにある.mp4ファむルをtestbディレクトリにコピヌするようにしおいたす。

cp_script.sh
#!/bin/bash
# testaの.mp4ファむルをtestbにコピヌする
cp /home/hisui/workspace/watchman-script/testa/*.mp4 /home/hisui/workspace/watchman-script/testb/

䞊蚘はただただファむルをコピヌするだけですが、シェルスクリプトを実行できるため、シェルスクリプトでできるこずならば䜕でもできたす。 ただし、䞊蚘だずファむルの䜜成だけでなく、ファむルの曎新ず削陀もトリガずなり、その床に指定したスクリプトが実行されたす。

動䜜確認

前節で蚭定したトリガが正しく動䜜するか確認したす。 ディレクトリtestaに適圓な.mp4ファむルを䜜成したす。

タヌミナル
$ touch ./testa/test.mp4

するず、testbディレクトリに.mp4ファむルがコピヌされたす。

タヌミナル
$ ls ./testb
test.mp4

このように、testaディレクトリに.mp4ファむルが新芏䜜成されたら、testbディレクトリに.mp4ファむルをコピヌするように蚭定できたした。

トリガ䞀芧を確認する

以䞋で蚭定したトリガ䞀芧を確認できたす。
trigger-listの埌には、トリガを蚭定したディレクトリのパスを指定する必芁がありたす。

タヌミナル
$ watchman trigger-list testa
{
    "version": "20231008.002904.0",
    "triggers": [
        {
            "append_files": true,
            "stdin": [
                "name",
                "exists",
                "new",
                "size",
                "mode"
            ],
            "expression": [
                "anyof",
                [
                    "match",
                    "*.mp4",
                    "wholename"
                ]
            ],
            "name": "cpmp4",
            "command": [
                "sh",
                "/home/hisui/workspace/watchman-script/cp_script.sh"
            ]
        }
    ]
}

もしどのディレクトリにトリガを蚭定したか忘れおしたった堎合は、すでに解説したwatch-listコマンドを䜿うこずで監芖察象ずしたディレクトリのパスを確認できたす。

ちなみに、トリガ未蚭定のディレクトリに察しおtrigger-listコマンドを実行するず以䞋のように゚ラヌが衚瀺されたす。

タヌミナル
$ watchman trigger-list testb
{
    "version": "20231008.002904.0",
    "error": "watchman::RootResolveError: failed to resolve root: unable to resolve root /home/hisui/workspace/watchman-script/testb: failed to resolve root: directory /home/hisui/workspace/watchman-script/testb is not watched"
}

トリガを削陀する

蚭定したトリガを削陀するには、trigger-delコマンドを䜿いたす。

タヌミナル
$ watchman trigger-del [ディレクトリのパス] [トリガヌ名]

トリガヌ名に぀いおは、すでに解説したtrigger-listコマンドで確認できたす。

たずめ

Watchman を䜿うこずで、指定したディレクトリを監芖しお、条件が満たされた時にスクリプトを実行できたす。スクリプトを色々ず工倫すればかなり柔軟に色々なこずができたす。むンストヌルも簡単なので、䜕かディレクトリの監芖ず操䜜を自動化したいずいう堎合はぜひ䜿っおみおください。