当Linux中目录的内容更改时,如何自动运行脚本?


Answers:


17

如果您很幸运可以使用基于debian的发行版,请访问apt-get install dnotify。其他发行版可能也有类似的内容-查找dnotify名称。

dnotify是基于Linux内核2.4.19+的dnotify API的简单程序。每次特定目录的内容更改时,dnotify都可以执行指定的命令。它从命令行运行,并带有两个参数:一个或多个要监视的目录,以及在目录更改时要执行的命令。选项控制要触发的事件:何时在目录中读取文件,何时创建,删除文件等等。

如果要在自己的程序中处理此问题,则dnotify也是要使用的API。


4
@MikeB,在Googling通知您建议后,我最终使用了inotify代替,后者显然取代了它。感谢您为我指明了正确的方向。apt-get install inotify-tools
GeneQ

7
@ GeneQ,inotify取代了dnotify。
大卫,2009年

1
同样在Gentoo上:emerge inotify-tools
James Sneeringer,2009年

是的,我要说的是,内核2.4.19有点古老;-) inotify是必经之路。
David Z

哦,是的...我忘记了最近的一个:)
MikeyB

12

您可以使用inotify-tools运行脚本,如下所示。它将监视目录中已修改文件,新文件和已删除文件的更改,然后将执行脚本。

#!/bin/sh
while inotifywait -e modify -e create -e delete /home/me/code; do
    rsync [options] /home/me/code/ /media/nfs/code/ 
done

只要考虑到如果在复制源目录时更改它,inotifywait将不会看到它,并且这些更改将不会被复制,直到复制完成后再进行更改。可能不是问题。
劳尔·萨利纳斯-蒙塔古多

如何在守护程序模式下运行它?
克里斯·F

4

我想,incron基本上就是您想要的。它使用inotify作为通知机制(正如其他人指出的那样,该机制取代了dnotify),但不需要使用inotifywait或类似的脚本连续运行的脚本(尽管显然,incron守护程序一直在运行)。系统范围的“ crontabs”和用户“ crontabs”的支持方式与标准cron相似,但不是将时间指定为触发器,而是使用inotify事件和文件/目录名称。

我相信,incron被打包用于许多发行版,包括Ubuntu和Debian。



0

entr是我所见过的最简单,最可组合的文件通知工具。它的使用针对观察文件而不是目录进行了优化,但是它也可以解决您的情况。

要检测添加的文件并对其执行操作,请将其与其他工具(例如)结合使用makeentr不发送名称或类似名称,它只是运行您告诉它要运行的名称。

要检查目录中添加的文件:

## 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

...这就是循环机制派上用场的地方,因为find如果添加了文件,表达式将再次运行。

如果您想要更好的错误处理,并且想要确保每个添加/删除的文件只能运行一次,则可能会有些古怪,但是对于这些简单的情况来说,这是很不错的选择。


编辑:如果您想在系统级别上执行此操作,例如incron,只需将脚本添加到您喜欢的进程管理器(例如s6runitsystemdsysvinit,然后跳过循环:

#!/bin/bash
exec entr -d do_stuff < <(find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/*)

当从进程管理器运行时,exec和进程替换(<(...))非常重要,以正确处理信号(即,使shell不受干扰)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.