下面的脚本监视目标目录中的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因此,现在它正在正确地监视close_write事件下的文件,例如/home/sammy/ftp/files和/home/neo/ftp/files。
我面临的问题是,一旦创建了一个新用户,比方说mike,那么手表似乎不再工作了,我将不得不重新执行脚本,以便它知道新用户的路径,即nohup进程需要被终止并再次运行。
有什么方法让inotifywait等着知道新创建的目录吗?
发布于 2022-05-18 23:52:01
使用-r,它会自动找到在它正在监视的目录下创建的新目录。但是在这里,它得到路径/home/sammy/ftp/files和/home/neo/ftp/files (等等),而/home/mike不在它们的下面,所以不会被检测到。(请记住,在/home/*/ftp/files运行之前,是shell扩展了glob inotifywait。)
原则上,您可以查看整个/home,并手动忽略/home/*/ftp/files中没有的任何内容。但这将产生成堆的手表,并产生大量不必要的事件。
一个更好的主意是,除了/home目录之外,还可以监视/home/*/ftp/files,并在看到/home下添加的新子目录时重新启动手表。如果任何新用户总是立即创建ftp/files目录,那应该不会太糟糕。但是,您可能应该显式地等待新的ftp/files目录出现,这样您就不会陷入脚本在创建新ftp/files之前重置inotifywait的竞争,从而丢失它。
(尽管重新启动inotifywait创建了一个窗口,可以在其中创建一个新文件,但脚本却丢失了它。这样的东西可能会更安全地使用一些直接支持inotify的编程语言。)
另一种完全不同的方法是更改目录结构,这样相关的内容将在/home/$user/files/ftp中而不是/srv/ftp/$user中。然后,您只需在/srv/ftp上添加一个手表,就可以自动捕获新用户,而不会出现问题。
https://unix.stackexchange.com/questions/703082
复制相似问题