如何在目录内容更改时自动调用bash脚本

时间:2013-06-13 11:00:40

标签: linux bash shell ubuntu

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

详细情景:

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

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

2 个答案:

答案 0 :(得分:5)

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

#!/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,它在某些事件上执行脚本。但事件是文件系统事件而不是计时器事件。

答案 1 :(得分:2)

“inotifywait”还有另一种选择:

-d --daemon     与--monitor相同,除了在后台运行将事件记录到文件中     必须由--outfile指定。意味着--syslog。

为了完整性:

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

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

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

只有一个男人的ramblins, ~~~ 8d; -Dan