フォルダを削除して再作成すると、inotifywaitは機能しません。

フォルダを削除して再作成すると、inotifywaitは機能しません。

フォルダを監視するために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ディレクトリを監視して達成することが何であるかわからないので、これ以外のものを使用するのが最善の選択かどうかはわかりません。ただし、おそらく最善のアプローチは、udevUSBスティックをマウントし、inotifywaitUSBスティックを挿入するときにプロセスを開始し、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ディスクの挿入時にディスクを自動的にマウントしようとする他のプロセスと競合しないことを確認してください。

関連情報