そのうち必要になりそうなのでメモ。
こちらを自分用に寄せたもの。
Linuxでファイルの変更を検知して、スクリプトを自動実行する(inotifywaitコマンド)
つくりたいもの
rootとなるディレクトリの配下に複数のディレクトリ(以下、子ディレクトリ)がある。
子ディレクトリの中に特定のファイルが生成されたとき、その子ディレクトリ内の別のファイルの内容を書き換える。
満たすべき機能
- rootディレクトリ名は引数で指定
- 生成を検知するファイル名・書き換え対象のファイル名は固定
- 子ディレクトリは、外部から生成・削除
- ディレクトリ名は任意
- スクリプト実行後もディレクトリの監視を継続
使用する物
- inotify-tools( https://github.com/rvoicilas/inotify-tools/wiki#info )の
inotifywait
コマンド - あとはbash
つくりかた
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で動かしたい。