删除并重新创建文件夹时 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 似乎不会继续监视它,除非我inotifywait -m -r /home/oshiro/Desktop/work_folder再次运行。

我该如何解决这个问题?我基本上想监控一个在一天中会多次插入和拔出的 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不会与插入磁盘时可能尝试自动安装磁盘的其他进程发生冲突。

相关内容