忍者ブログ
物理学者(ポスドク)による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)
(タイトルにDebian8って付いてるのは今回触ったサーバーがDebian8だったからです。おそらくDebian10でもそのまま動くと思われる)


■ inofity-toolsのインストール
% sudo apt install inotify-tools
■ あるディレクトリを監視する
% inotifywait -m -e "ATTRIB" --format '%T %w%f (%e)' --timefmt '%F %T' -r ./
この例ではカレントディレクトリ以下を再帰的に監視する
そこにのファイルがアクセス件やタイムスタンプなどのメタデータが変更されたときに、画面に表示される
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のオプションにはそれらしきものはなかったので、ファイル名からそれを取り出して対応する
#!/bin/bash -e

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を使って、それをサービスとして登録することにする


■ 参考 : systemdでデーモン化

■ 参考 : 今回のお題 - inotify でディレクトリを監視してみる

(どうでもいいけど、2つめの記事は2009年の記事らしい。内容の密度が半端ない。それに対して最近のアドセンスで稼ごうとしてる記事たちの内容の希薄さよ・・・)


一般的なsystemd関連のページ

■ 参考 : 自作したシェルスクリプトを Linux の systemd サービスとして起動する方法


(このあとsystemdのことをあれこれ調べて書いたけど、間違って消してしまったぁああああああああああ)

/etc/systemd/system 以下にサービスを作成する
ファイル名はサービス名.serviceにしておく
[Unit]
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
なんかトラブルが起こってそうなら、statusの画面で一番下にエラーメッセージが表示される





(2022/10/17 追記)

サービスの設定ファイルを修正したときは

sudo systemctl restart hoge

ではダメ
Warning: Unit file of hoge.service changed on disk, 'systemctl daemon-reload' recommended.
みたいな警告が出ているはず

このときは警告に従って
sudo systemctl daemon-reload
とすればOK






■ (code=exited, status=217/USER)というエラーが出たら、これはサービスのファイル中のUserがおかしいとき

困ったら、sudo tail /var/log/syslog を見てみる





■ (code=exited, status=203/EXEC) というエラーが出たら、

これはpermissionの問題なので、
cd /etc/systemd/system
chmod 644 hoge.service
これを744にすると、systemdから
Please remove executable permission bits. Proceeding anyway.
のようなエラーが出てきた





(2023/02/15 追記)

rsyncでコピーしたファイルに対して、inotifyを使おうとしたがpermissionなどを含めてコピーする必要があった

crontabでrsyncすると、sudo権限が使えない

rsync -rlOtcv ....
みたいなオプションを使ったら解決した

■ 参考 : Jenkinsで成果物(artifact)をrsyncでコピーしようと思ったらエラーでJOBが失敗






PR
この記事にコメントする
Name
Title
Color
E-Mail
URL
Comment
Password   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
プロフィール
HN:coffee
職業:物理屋(自称)
趣味:映画鑑賞、登山
出身:大阪府の南の田舎
自己紹介:
import MyProfile
import coffee_pote from TWITTER
import amazonのほしい物リスト from WISH_LIST

print "先月子供が産まれました!"

# 最終更新 2022/10/25
カウンター
カウンター カウンター
ブログ内検索
ツイートするボタン
リンク
相互リンク募集中です (Twitterにてお知らせください)

Demo scripts for gnuplot version 5
(gnuplotのさまざまなデモ画像と作り方がまとめられている、眺めているだけでできるようになった気分になれる)

gnuplotスクリプトの解説
(米澤進吾さんの個人ページ、gnuplotと言えばこのかた)

gnuplot のページ
(Takeno Lab、うちのブログがリンクされていたのでリンク返し)

Twitterから映画の評価が分かる & 映画の鑑賞記録が残せる coco
(映画の感想をまとめられるサイト、いつもお世話になっています)

Astronomy Picture of the Day Archive
(天文や宇宙関連の最新の話題について画像とともにNASAが説明しているページ)

今日のほしぞら
(任意の時刻の空で見える星を表示してくれる、国立天文台が管理している)

GNUPLOTとアニメーション
(応用の項目の「見せてあげよう!ラピュタの雷を!!」あたりからすごすぎる)

読書メーター
(読んだ本をリストできる便利なサイト)

flickr難民の写真置き場
(20XX年、flickrは有料化の炎に包まれた。あらゆるflickr無料ユーザーは絶滅したかに見えた。 しかし、tumblr移住民は死に絶えてはいなかった。)

教授でもできるMac OS X へのLaTeX, X11, gccのインストレーションと環境設定
(阪大の山中卓さんのwebページ、タイトルにセンスが溢れている、内容は超充実してる、特にTeX関連、学振DCとかPDの申請書類作成時にはお世話になっております)

英語論文執筆用の例文検索サービス
(とんでもないものを見つけてしまった・・・・ arXivに収録されている 811,761報の 英語論文から,例文を検索するための検索エンジン)


Template "simple02" by Emile*Emilie
忍者ブログ [PR]