inotifywait 未检测到新目录

inotifywait 未检测到新目录

下面的脚本监视 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,即可毫无问题地自动吸引新用户。

相关内容