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 不适合我的需求,因为我不是基于时间的操作,而是基于事件的操作。
首先,如果您删除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规则挂载不会与插入时尝试自动挂载磁盘的其他进程冲突。
| 归档时间: |
|
| 查看次数: |
3124 次 |
| 最近记录: |