今日のsystemd ユニットファイルのコレクションから各デーモンの初期化構成を読み取ります 、しばしば単にユニットと呼ばれます 。 パスユニットを使用 、特定のイベントについてファイルとディレクトリを監視できます。指定されたイベントが発生した場合、サービスユニット が実行され、通常はパスユニットと同じ名前が付けられます。これがどのように機能するかを簡単な例で示します。
ファイルを監視したいとします。書き込み後にファイルを閉じるときはいつでも、特定のスクリプトを開始する必要があります。
パスユニット:example.path
ディレクトリ/etc/systemd/system/ ファイルexample.pathを作成します 次の内容で:
[Unit]
Description=Monitor the file for changes
[Path]
PathChanged=/home/john/testfile
Unit=example.service
[Install]
WantedBy=multi-user.target
[Path]内 セクション、PathChanged= Unit=の場合、監視するファイルへの絶対パスを指定します ファイルが変更された場合に実行するサービスユニットを示します。このユニット(example.path )システムがマルチユーザーモードのときに開始する必要があります。
次に、対応するサービスユニットexample.serviceを作成します /etc/systemd/system/にあります 。
サービスユニット:example.service
ファイルtestfileの場合 変更(書き込みとクローズの両方を意味します)すると、次のサービスユニットが呼び出され、指定されたスクリプトが実行されます。
[Unit]
Description=Executes script when a file has changed.
[Service]
Type=simple
ExecStart=/home/john/script.sh
[Install]
WantedBy=multi-user.target
この例では、ファイルscript.sh 次のコードのみが含まれています:
#!/bin/bash
echo "file changed" >/home/john/output.txt
パスユニットをテストするには、これらの新しいユニットの両方をアクティブ化する必要があるため、次を実行します。
$ sudo systemctl enable example.{path,service}
$ sudo systemctl start example.path
ここで、ファイルtestfileを書き換える、または書き込む場合 、対応するサービスユニットが実行され、ファイルoutput.txt ユーザーjohnで作成されます のホームディレクトリ。
次の不完全で網羅的ではないリストは、パスユニットによってSysadminDayが少し簡単になる例を示しています。
- イベント駆動型のデータ処理を開始します。
-
/etcの下のファイルを監視する 、変更が発生したときに通知を送信します。 -
importを監視します 新しいファイル用のフォルダを作成し、処理を開始します。
パスユニットを使用したテスト中に、特定の状況ですべてのイベントがキャッチされるわけではないことに気付きました。たとえば、パスユニットを設定してパスの変更を監視してから、次のコマンドを実行します。
$ touch /path/file && rm /path/file
ここでは、サービスユニットが2回実行されることを期待しています。1回目はtouch コマンド、およびrmの2回目 指図。この問題が設計によるものなのか、修正可能な不具合によるものなのかを確認するために、Bugzillaレポートを提出しました。
systemdについて詳しく知りたい場合 パスユニットとサービスユニットを含むユニットについては、次のマニュアルページを参照してください。
- systemd.unit(5)
- systemd.path(5)
- systemd.service(5)
また、私のバグレポートの結果に興味がある場合は、ここでフォローできます:
バグ1722627-パスユニットがすべてのイベントをキャッチしない