删除并重新创建文件夹时,inotifywait 不起作用

osh*_*nen 2 linux monitoring directory mount inotify

我正在尝试使用 inotifywait 来监视文件夹:

inotifywait -m -r /home/oshiro/Desktop/work_folder
Run Code Online (Sandbox Code Playgroud)

该命令有效,如果我在该文件夹中创建文件,一切似乎都能正常工作。

当文件夹被监控时,如果我删除它,我会得到以下输出:

/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 
Run Code Online (Sandbox Code Playgroud)

如果我然后再次重新创建该文件夹,而监视仍在进行,那么 inotifywait 似乎不会继续监视它,除非我inotifywait -m -r /home/oshiro/Desktop/work_folder再次运行。

我该如何解决这个问题?我基本上想监控一个 USB 记忆棒,该记忆棒将在一天内多次插入和移除。当它被拔掉并重新插入时,我认为 inotifywait 将停止监视它,就像上面的文件夹被删除并重新创建一样,inotifywait 无法继续监视它,除非我再次运行上面的命令,即inotifywait -m -r /home/oshiro/Desktop/work_folder

我应该使用更适合此类任务的东西而不是使用 inotifywait 吗?cron 不适合我的需求,因为我不是基于时间的操作,而是基于事件的操作。

Gra*_*eme 7

首先,如果您删除inotifywait正在观看的文件夹,那么,是的,它将停止观看。解决这个问题的显而易见的方法是简单地监视一级目录(您甚至可以创建一个目录来特别监视并将您的目录放在work_folder那里。

但是,如果您的文件夹下有一个卸载/重新安装而不是删除/重新创建的文件夹,则这将不起作用,这两者是非常不同的过程。我不知道是否使用其他东西而不是inotifywait这里最好的东西,因为我不知道你想通过监视目录来实现什么。然而,也许最好的办法是设置一个udev规则来调用脚本,该脚本安装 USB 记忆棒并在inotifywait插入时启动进程,另一个在拔下时再次停止。

您可以将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}'"
Run Code Online (Sandbox Code Playgroud)

ID_SERIAL该设备可由下式确定:

udevadm info --name=/path/to/device --query=property
Run Code Online (Sandbox Code Playgroud)

与脚本类似:

#!/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
Run Code Online (Sandbox Code Playgroud)

另外,请确保通过udev规则挂载不会与插入时尝试自动挂载磁盘的其他进程冲突。