我正在尝试使用 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
不会与插入磁盘时可能尝试自动安装磁盘的其他进程发生冲突。