【问题标题】:How to call a bash script automatically when directory contents chage目录内容更改时如何自动调用bash脚本
【发布时间】:2013-06-13 11:00:40
【问题描述】:

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

详细场景:

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

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

【问题讨论】:

  • 你见过inotify吗?
  • 是的,我见过,但是,我从来没有使用过,也找不到任何文章正确描述使用 inotify 调用 abash 脚本
  • 例如可以使用inotifywait
  • "hek2mgl" 提供了相同的解决方案...让我检查一下。
  • 我得到了“hek2mgl”提供的解决方案,但它在子目录中不起作用,请建议修改“hek2mgl”提供的代码...谢谢

标签: linux bash shell ubuntu


【解决方案1】:

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

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

【讨论】:

  • 我尝试了您的解决方案。我在终端中收到“正在设置手表。已建立手表。”并且程序没有终止。我对inotify 很陌生。所以请澄清..
  • 在文件夹中进行一些更改,您将看到。 :) 程序永远不会以当前版本终止。它将永远等待变化。请注意,我会 AFK 一段时间。稍后会回到这里。
  • 好的,我在哪里可以找到 inotify 的结果,它在 "directory="/tmp" 里面吗(我根据需要更改了 tmp)? !!
  • inotifywait 不产生任何输出。请参阅我链接的手册页。你也可以谷歌这个。我只是想为您指明正确的方向
  • 使用-r 标志和inotifywait 来查看所有子目录。请阅读inotifywait 的手册页。
【解决方案2】:

“inotifywait”还有另一个选项:

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

为了完整性:

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

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

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

只有一个人的漫无边际, ~~~ 8d;-丹

【讨论】:

    猜你喜欢
    • 2022-08-09
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多