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


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

つくりたいもの

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

満たすべき機能

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

使用する物

つくりかた

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

./dir1/ CREATE aa.txt

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

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

#!/bin/bash

DIR=$1
CREATED_FILENAME='createdfile'
MODIFIED_FILENAME='modifiedfile'

inotifywait -m -r ${DIR} -e CREATE,DELETE | while read line
  do
    declare -a params=( ${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;;

      *)
        ;;
    esac
  done

注意点

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

今後

systemdで動かしたい。