6

我的目标是在将任何新文件添加到特定目录或该特定目录的任何子目录时自动运行 bash 脚本。

详细场景:

我正在为教师向学生提交文件创建一个自动化流程,反之亦然。发件人将上传文件,并将其存储在 LAMP 服务器的Uploads目录中,格式为 ex。“name_course-name_filename.pdf”。我想要一些方法,以便当任何文件存储在 Uploads 文件夹中时,同时调用一个脚本并将该文件发送到接收列表。从数据库中,我可以找到该特定课程和学生的接收者列表。

我唯一关心的是,当目录内容发生变化时,如何自动调用脚本并使其在单个文件上工作。Cron 会间隔执行,但不是实时工作。

4

2 回答 2

4

Linux 为此提供了一个很好的机制,称为inotify. inotify主要作为 C API 提供。但是也有开发的 shell 实用程序。为此,您应该使用inotifywaitfrom inotifytools(pkg name in debian)。这是一个基本的例子:

#!/bin/bash

directory="/tmp"   # or whatever you are interested in

inotifywait -m -e create "$directory" |
while read folder eventlist eventfile
do
    echo "the following events happened in folder $folder:"
    echo "$eventlist $eventfile"
done

更新:

如果问题变得复杂,例如您必须监视递归的动态目录结构,您应该看看incron它是一个类似于 cron 的守护进程,它在某些事件上执行脚本。但是这些事件是文件系统事件而不是计时器事件。

于 2013-06-13T11:11:02.037 回答
1

'inotifywait' 还有另一个选项:

-d --daemon 与 --monitor 相同,但在后台运行,将事件记录到必须由 --outfile 指定的文件。暗示 --syslog。

为了完整性:

-m --monitor 不是在接收到单个事件后退出,而是无限期地执行。默认行为是在第一个事件发生后退出。

在“while”语句的 do-done 块中,您可以解析每个事件报告以获取有趣的细节,然后使用“case-esac”根据您关心的每个事件采取行动。

对于您计划依赖的操作,您还可以考虑将硬编码的“$directory”替换为某种配置文件。这样的文件可能包括路径和文件名、该路径和文件的有趣事件以及在这些事件发生时运行的脚本。该脚本可能会将事件列表作为参数,然后再次“case-esac”。

只是一个人的漫无边际,~~~ 8d;-Dan

于 2013-12-05T20:44:40.240 回答