フォルダを監視するためにinotifywaitを使用しようとしています。
inotifywait -m -r /home/oshiro/Desktop/work_folder
コマンドが機能し、そのフォルダにファイルを生成すると、すべてが正常に動作するようです。
フォルダを監視しているときにフォルダを削除すると、次の出力が表示されます。
/home/oshiro/Desktop/work_folder/ MOVE_SELF
/home/oshiro/Desktop/work_folder/ OPEN,ISDIR
/home/oshiro/Desktop/work_folder/ CLOSE_NOWRITE,CLOSE,ISDIR
/home/oshiro/Desktop/work_folder/ MOVE_SELF
/home/oshiro/Desktop/work_folder/ ATTRIB,ISDIR
/home/oshiro/Desktop/work_folder/ OPEN,ISDIR
/home/oshiro/Desktop/work_folder/ DELETE Untitled Document
/home/oshiro/Desktop/work_folder/ DELETE Untitled Document 2
/home/oshiro/Desktop/work_folder/ CLOSE_NOWRITE,CLOSE,ISDIR
/home/oshiro/Desktop/work_folder/ DELETE_SELF
監視が進行中にフォルダを再作成した場合、再度inotifywait -m -r /home/oshiro/Desktop/work_folder
実行しないと、inotifywaitは監視を継続しないようです。
この問題をどのように解決できますか?私は基本的に一日中何度も接続して切断するUSBスティックを監視したいと思います。プラグを抜いて再接続すると、inotifywaitが監視を停止するようです。上記のフォルダが削除され、再作成されるように、inotifywaitは上記のコマンドを再実行しないと監視を続行できません。inotifywait -m -r /home/oshiro/Desktop/work_folder
inotifywaitを使用する代わりに、この種の作業に適したものを使用する必要がありますか? cronは時間ベースのタスクに従わず、イベントベースのタスクに従うため、私の要件には適していません。
答え1
最初にinotifywait
監視中のフォルダを削除すると、はい、監視は停止します。この問題を解決するための確実な方法は、単に親ディレクトリを監視することです。具体的には、監視するディレクトリを作成し、work_folder
そこにディレクトリを配置することもできます。
ただし、削除/再作成ではなく、削除/再インストールフォルダがある場合は機能しません。両方のプロセスは非常に異なります。inotifywait
ディレクトリを監視して達成することが何であるかわからないので、これ以外のものを使用するのが最善の選択かどうかはわかりません。ただし、おそらく最善のアプローチは、udev
USBスティックをマウントし、inotifywait
USBスティックを挿入するときにプロセスを開始し、USBスティックを削除するときにプロセスを再び停止するスクリプトを呼び出す規則を設定することです。
udev
/etc/udev/rules.d`ディレクトリの.rulesファイルにルールを配置できます。ルールは次のとおりです。
ENV{ID_SERIAL}=="dev_id_serial", ACTION=="add", \
RUN+="/path/to/script add '%E{DEVNAME}'"
ENV{ID_SERIAL}=="dev_id_serial", ACTION=="remove", \
RUN+="/path/to/script remove '%E{DEVNAME}'"
ID_SERIAL
デバイスの位置は次のように確認できます。
udevadm info --name=/path/to/device --query=property
スクリプトは次のとおりです。
#!/bin/sh
pid_file=/var/run/script_name.pid
out_file=/var/log/script_name.log
# try to kill previous process even with add in case something
# went wrong with last remove
if [ "$1" = add ] || [ "$1" = remove ]; then
pid=$(cat "$pid_file")
[ "$(ps -p "$pid" -o comm=)" = inotifywait ] && kill "$pid"
fi
if [ "$1" = add ]; then
/bin/mount "$2" /home/oshiro/Desktop/work_folder
/usr/bin/inotifywait -m -r /home/oshiro/Desktop/work_folder \
</dev/null >"$out_file" 2>&1 &
echo $! >"$pid_file"
fi
また、ルールを介したインストールがudev
ディスクの挿入時にディスクを自動的にマウントしようとする他のプロセスと競合しないことを確認してください。