dnotify 是一个基于 Linux 内核 2.4.19+ 的 dnotify API 的简单程序。dnotify 可以在每次特定目录的内容发生变化时执行指定的命令。它从命令行运行并接受两个参数:一个或多个要监视的目录和一个在目录更改时执行的命令。选项控制要触发的事件:何时在目录中读取文件,何时创建、删除文件等等。
## entr exits with rc=0 when terminated
## rc=1 when watched files go away or don't exist to begin with
## rc=2 when new files arrive in watched directories
until echo /path/to/directory_to_watch | entr -d do_stuff
do sleep 1; done
如果您还想在现有文件更改时采取行动:
## Here's why it comes in handy that entr exits when new files are added --
## find gets re-run.
until find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/* |
entr -d do_stuff
do sleep 1; done
如果您有幸使用基于 debian 的发行版,
apt-get install dnotify
. 其他发行版可能有类似的东西 - 寻找dnotify
名称。如果您想在自己的程序中处理此问题,dnotify 也是您要使用的 API。
您可以使用 inotify-tools 运行脚本,类似这样。它将监视目录中已修改文件、新文件和已删除文件的更改,然后执行脚本。
我认为, incron基本上是您想要的。它使用 inotify 作为通知机制(正如其他人指出的那样,它取代了 dnotify),但不需要使用 inotifywait 或类似方法连续运行的脚本(尽管显然 incron 守护程序一直在运行)。系统范围的 'crontabs' 和用户 'crontabs' 的支持方式与标准 cron 类似,但不是将时间指定为触发器,而是使用 inotify 事件和文件/目录名称。
我相信,incron 已为许多发行版打包,包括 Ubuntu 和 Debian。
有一个专门用于此目的的软件,autoenv 你可能想检查一下。
entr是我见过的最简单、最可组合的文件通知工具。它的使用针对查看文件而不是目录进行了优化,但它也可以解决您的问题。
要检测并处理添加的文件,请将其与其他工具(例如
make
.entr
不发送名称或类似的东西,它只是运行你告诉它运行的东西。要检查目录中添加的文件:
如果您还想在现有文件更改时采取行动:
...这就是循环机制派上用场的地方,因为
find
如果添加了文件,表达式将再次运行。如果您想要更好的错误处理并希望确保每个添加/删除的文件只运行一次,事情会变得有点古怪,但对于这些简单的情况来说,它很棒。
编辑:如果您想在系统级别执行此操作,例如incron,只需将脚本添加到您最喜欢的进程管理器(例如s6、runit、systemd或sysvinit并跳过循环:
和
exec
进程替换 (<(...)
) 在从进程管理器运行时很重要,以正确处理信号(即让 shell 不碍事)。