(タイトルにDebian8って付いてるのは今回触ったサーバーがDebian8だったからです。おそらくDebian10でもそのまま動くと思われる)
inofity-toolsのインストール
あるディレクトリを監視する
そこにのファイルがアクセス件やタイムスタンプなどのメタデータが変更されたときに、画面に表示される
touch hoge.txt
とかでテストできる
- rオプション
- mを付けると、監視をずっと継続してくれる(おそらくmonitorの略)
これを付けないと1度画面表示したら終了してしまう
-
- formatは画面表示の形式を選べる
- timefmtは時間の表示形式
(今回はこれらはログとして残すだけなのであんまり関係ない)
- eで選べるイベントはヘルプによるとEvents:日本語の説明↓
access file or directory contents were read
modify file or directory contents were written
attrib file or directory attributes changed
close_write file or directory closed, after being opened in
writable mode
close_nowrite file or directory closed, after being opened in
read-only mode
close file or directory closed, regardless of read/write mode
open file or directory opened
moved_to file or directory moved to watched directory
moved_from file or directory moved from watched directory
move file or directory moved to or from watched directory
create file or directory created within watched directory
delete file or directory deleted within watched directory
delete_self file or directory was deleted
unmount file system containing file or directory unmounted
使うのは
modify : ファイルが修正されたとき
create : ファイルが新規作成されたとき
くらいかな?■ 参考 : inotify-toolsでファイルやディレクトリを監視する
さらに-oでファイルを指定すると、inotifyで出力されるログの出力先を指定できる
とりあえず /tmp/inotify.log とかでいいか?- o /tmp/inotify.log
- qオプション
イベントのみを画面に表示したいとき
監視ファイルの上限数
■ 参考 : NASのバックアップ対象ディレクトリをinotifyで監視して更新されたディレクトリのみをrsyncでミラーリング
自分の環境では8192ファイルになっていた
一応、上限は上げておいたほうが良いかも
本番環境ではなぜか65536になっていた・・・
これならまぁ十分でしょう
ファイルの拡張子に応じて動作を変更したい
inotifywaitのオプションにはそれらしきものはなかったので、ファイル名からそれを取り出して対応する
LOGFILE=/tmp/inotify.log
DIR_WATCH=hoge
/usr/bin/inotifywait -m -r -e "ATTRIB" --format '%T %w%f (%e)' --timefmt '%F %T' $DIR_WATCH |
while read line; do
echo "one event was detected." >> $LOGFILE 2>&1
echo "$line" >> $LOGFILE 2>&1
fname=`echo $line | awk '{print $3}'`
extension=${fname##*.}
"$extension" == "png" && {
echo "process started.">> ${LOGFILE} 2>&1
hogehoge.py $fname >> ${LOGFILE} 2>&1
echo "process finished.">> ${LOGFILE} 2>&1
| { |
echo "$extension is out of support." >> ${LOGFILE} 2>&1
}
done
これをこの後サービス化するので、変なファイルを食わせたりしてエラーがきちんと起こるかどうかテストしてた
エラーが起こった時にプロセスが無限ループに入って、トラブらないかが問題
■ 参考 : 特定のフォルダに画像を保存するだけで、予め設定した縦横ピクセル数や画質の画像をオンデマンドで自動的に出力する処理をbashで書いてみる
■ 参考 : inotify-tools/inotify-tools (github)
サービス化
バックグラウンドで動かすには nohupと&を付けたら良さそう
けど、常時立ち上がってて、かつプロセスが死んだ時は勝手に立ち上がってほしい
(たぶんそういうのをサービス化とかデーモン化と言うんだろう、と理解してるが合ってるんだろうか?)
調べた感じ、inotifyにはその機能はデフォルトで入ってて、 -dを付けて走らせればいいと書いてあるがそれをやってもうまく行かない
よくわからないので、シェルスクリプトの中でinotifywaitを使って、それをサービスとして登録することにする
■ 参考 : 今回のお題 - inotify でディレクトリを監視してみる
(どうでもいいけど、2つめの記事は2009年の記事らしい。内容の密度が半端ない。それに対して最近のアドセンスで稼ごうとしてる記事たちの内容の希薄さよ・・・)
一般的なsystemd関連のページ
■ 参考 : 自作したシェルスクリプトを Linux の systemd サービスとして起動する方法
(このあとsystemdのことをあれこれ調べて書いたけど、間違って消してしまったぁああああああああああ)
/etc/systemd/system 以下にサービスを作成する
ファイル名はサービス名.serviceにしておく
Description="serivice of monitoring directory and launching something"
Documentation=
# After=
[Service]
Type=simple
User=controls
Group=controls
Restart=on-failure
#Restart=always
RestartSec=2s
ExecStart=/home/hoge/run.sh
StandardOutput = syslog
StandardError = syslog
SyslogIdentifier = hogehoge
[Install]
WantedBy = multi-user.target
systemctl list-unit-files --type=service
# サービスの自動起動をオンにする
sudo systemctl enable hoge
# サービスの状態を確認する
sudo systemctl status hoge
# サービスを止める
sudo systemctl stop hoge
# サービスを開始
sudo systemctl start hoge
サービスの設定ファイルを修正したときは
sudo systemctl restart hoge
ではダメ
みたいな警告が出ているはずこのときは警告に従って
(code=exited, status=217/USER)というエラーが出たら、これはサービスのファイル中のUserがおかしいとき
困ったら、sudo tail /var/log/syslog を見てみる
(code=exited, status=203/EXEC) というエラーが出たら、
これはpermissionの問題なので、
chmod 644 hoge.service
Please remove executable permission bits. Proceeding anyway.
のようなエラーが出てきた
rsyncでコピーしたファイルに対して、inotifyを使おうとしたがpermissionなどを含めてコピーする必要があった
crontabでrsyncすると、sudo権限が使えない
rsync -rlOtcv ....
みたいなオプションを使ったら解決した