下面的脚本监视目标目录中的 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
所以现在它正在正确地监视例如/home/sammy/ftp/files
和下文件的 close_write 事件/home/neo/ftp/files
。
我面临的问题是一旦创建了一个新用户,比如说 mike,那么手表似乎不再工作,我将不得不重新执行脚本,以便它知道新用户的路径,即 nohup进程需要被杀死并再次运行。
inotifywait 有什么方法可以了解新创建的目录吗?
它会自动找到在
-r
它正在观看的目录下创建的新目录。但是在这里,它获取路径/home/sammy/ftp/files
和/home/neo/ftp/files
(等),并且/home/mike
不在其中任何一个之下,因此不会被检测到。(请记住,它是在运行/home/*/ftp/files
之前扩展 glob 的 shellinotifywait
。)原则上,您可以观看整个 of
/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
,自动捕捉新用户没有问题。