在Linux上监视目录的程序

有一个好友添加新产品的目录。

列表看起来像这样

$ ls path-to-dir/ 01 02 03 04 $ 

列出的数字不是文件,而是包含构build的目录名称。

我必须手动去每次检查是否有新的版本。 我正在寻找一种方法来自动执行此操作,以便程序可以在path-to-dir/更新path-to-dir/更新时向某些人(包括我)发送电子邮件。

  • 我们有一个已经存在的工具或者一个Perl库吗?

    inotify.h做了类似的事情,但是我的内核(2.6.9)不支持它。

我认为在Perl中可以有一个简单的方法。

  • 你认为这会起作用吗?

    继续在Perl中运行一个循环,每5分钟执行一次ls path-to-dir/ ,然后将结果存储在一个数组中。 如果发现新结果与旧结果不同,则使用邮件或电子邮件发送电子邮件 。

检查不同的ls输出会在目录中删除或重命名内容时发送消息。 您可以改为查找比上次发送的消息更新的文件。

这里是bash中的一个例子,你可以每5分钟运行一次:

 now=`date +%Y%m%d%H%M.%S` if [ ! -f "/path/to/cache/file" ] || [ -n "`find /path/to/build/dir -type f -newer /path/to/cache/file`" ] then touch /path/to/cache/file -t "$now" sendmail -t <<< " To: aaa@bbb.ccc To: xxx@yyy.zzz Subject: New files found Dear friend, I have found a couple of new files. " fi 

如果你打算使用perl,我相信优秀的File::ChangeNotify模块对你来说是非常有用的。 它可以使用inotify (如果可用),也可以使用各种平台提供的其他文件查看机制。 另外,作为后备,它有自己的观察实现,它可以在每个平台上工作,但是比专门的实现效率低。

难道它不是一个简单的shell脚本?

 while :;do n = 'ls -al path-to-dir | wc -l' if n -gt old_n # your Mail code here; set old_n=n also fi sleep 5 done 

是的,所描述的Perl中的循环可以做到这一点。

您可以跟踪上次修改目录的时间。 如果没有改变,就没有新的构建。 如果发生了变化,旧版本可能已被删除或添加新版本。 您可能不希望在删除旧版本时发送警报; 添加新版本时,发送电子邮件至关重要。

不过,我觉得msw有正确的想法, 当完成拷贝到新的目录时,构建应该通知。 它应该是一个脚本,可以通过更改来通知正确的人员列表,而不是使用makefile中的硬连线名称或其他任何构建控制系统。

你可以使用dnotify这是inotify的前身,应该可以在你的内核上使用。 它仍然支持较新的内核。