Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2722

inotifywaitによるディレクトリの監視とスクリプト実行

$
0
0

そのうち必要になりそうなのでメモ。
こちらを自分用に寄せたもの。
Linuxでファイルの変更を検知して、スクリプトを自動実行する(inotifywaitコマンド)

つくりたいもの

rootとなるディレクトリの配下に複数のディレクトリ(以下、子ディレクトリ)がある。
子ディレクトリの中に特定のファイルが生成されたとき、その子ディレクトリ内の別のファイルの内容を書き換える。

満たすべき機能

  • rootディレクトリ名は引数で指定
  • 生成を検知するファイル名・書き換え対象のファイル名は固定
  • 子ディレクトリは、外部から生成・削除
    • ディレクトリ名は任意
  • スクリプト実行後もディレクトリの監視を継続

使用する物

つくりかた

inotifywaitの標準出力からイベントの詳細を配列で受け取る。

./dir1/ CREATE aa.txt

あとは受け取った配列の中身から更新対象のファイルパスを作成し、更新を実行。
今回はsedを使って文字列を置換する(とりあえず "HELLO" -> "GOODBYE")。

つくったもの(サンプル)

#!/bin/bashDIR=$1CREATED_FILENAME='createdfile'MODIFIED_FILENAME='modifiedfile'

inotifywait -m-r${DIR}-e CREATE,DELETE | while read line
  do
    declare-aparams=(${line})event=${params[1]}dir=${params[0]}file=${params[2]}case${event}in'CREATE')if["`echo${file} | grep${CREATED_FILENAME}`"];then
          echo"FILE CREATED"echo${file}sed-i-e"s/HELLO/GOODBYE/"${dir}${MODIFIED_FILENAME}fi;;*);;esacdone

注意点

特定のファイルしか生成されない想定なので、CREATEDイベントを検知するだけで十分かと思ったが、sedのiオプションで生成される一時ファイル(sedhogeみたいなやつ)も検知してしまうので、ファイル名を指定する必要があった。

今後

systemdで動かしたい。


Viewing all articles
Browse latest Browse all 2722

Trending Articles