下面的脚本监视 TARGET 目录中的 close_write 事件并对文件执行某些操作
#!/bin/bash
TARGET=/home/*/ftp/files
inotifywait -m -r -e close_write $TARGET |
while read directory action file
do
if [[ "$file" =~ .*jpg$ ]] || [[ "$file" =~ .*mp4$ ]]
then
# do sth with the file
fi
done
所以现在它正在正确地监视 eg/home/sammy/ftp/files
和下文件的 close_write 事件/home/neo/ftp/files
。
我面临的问题是,一旦创建了新用户,比如说迈克,那么手表似乎不再工作,我将不得不重新执行脚本,这样它就会知道关于新用户的路径,即需要杀死 nohup 进程并再次运行。
inotifywait 有什么方法可以了解新创建的目录吗?
答案1
它-r
会自动查找在其正在监视的目录下创建的新目录。但在这里,它获取路径/home/sammy/ftp/files
和/home/neo/ftp/files
(等),并且/home/mike
不在其中任何一个之下,因此不会被检测到。 (请记住,shell在运行/home/*/ftp/files
之前就扩展了 glob inotifywait
。)
原则上,您可以观看整个/home
并手动忽略 中不存在的任何内容/home/*/ftp/files
。但这会产生大量的手表并产生大量不需要的事件。
更好的想法可能是/home
除了目录之外还进行监视/home/*/ftp/files
,并在看到 下添加了新的子目录时重新启动监视/home
。如果任何新用户总是ftp/files
立即创建目录,那应该不会太糟糕。不过,您可能应该明确等待新ftp/files
目录出现,这样您就不会陷入脚本在创建inotifywait
新目录之前重置的竞争,从而错过它。ftp/files
(虽然重新启动inotifywait
会创建一个可以创建新文件的窗口,但脚本丢失了它。使用某些直接支持 inotify 的编程语言可能会更安全。)
一种完全不同的方法是更改目录结构,以便/home/$user/files/ftp
相关内容不再位于 /srv/ftp/$user
.然后,您只需在 上添加手表/srv/ftp
,即可毫无问题地自动吸引新用户。