linux - 监视目录中的新文件,然后运行脚本

Posted

技术标签:

【中文标题】linux - 监视目录中的新文件,然后运行脚本【英文标题】:linux - watch a directory for new files, then run a script 【发布时间】:2016-04-29 16:32:56 【问题描述】:

我想在 Ubuntu 14.04 中观察一个目录,当在这个目录中创建一个新文件时,运行一个脚本。

具体来说,我有安全摄像头,当它们检测到运动时,它们会通过 FTP 捕获的视频上传。我想在这个 FTP 服务器上运行一个脚本,这样当创建新文件时,它们会立即镜像(上传)到云存储服务,这是通过我已经编写的脚本完成的。

我发现 iWatch 可以让我这样做 (http://iwatch.sourceforge.net/index.html) - 我遇到的问题是 iwatch 在 FTP 目录中创建文件时立即启动云上传脚本,即使文件正在进行中仍然被上传。这会导致云同步脚本上传 0 字节的文件,对我来说没用。

我可以在云上传脚本中添加一个“等待”,但它看起来很老套,无法预测等待多长时间,因为它取决于文件大小、网络条件等。

有什么更好的方法来做到这一点?

【问题讨论】:

【参考方案1】:

尽管在 cmets 中提到了 inotifywait,但完整的解决方案可能对其他人有用。这似乎有效:

 inotifywait -m -e close_write /tmp/upload/ | gawk 'print $1$3; fflush()' | xargs -L 1 yourCommandHere

将运行

  yourCommandHere /tmp/upload/filename

当一个新上传的文件关闭时

注意事项:

inotifywait 是 Ubuntu 中 apt 包 inotify-tools 的一部分。它使用内核 inotify 服务来监控文件或目录事件 -m 选项是监控模式,每个事件输出一行到标准输出 -e close_write 用于打开以进行写入的文件的文件关闭事件。文件关闭事件有望避免收到不完整的文件。 /tmp/upload 可以替换为其他目录进行监控 gawk 的管道重新格式化inotifywait 输出行以删除第二列,这是事件类型的重复。它将第 1 列中的目录名与第 3 列中的文件名组合成一个新行,每行刷新一行以消除缓冲并鼓励xargs 立即采取行动 xargs 获取文件列表并为每个文件运行给定的命令,并在命令末尾附加文件名。 -L 1 使 xargs 在标准输入接收到每一行之后运行。

【讨论】:

【参考方案2】:

你在那里接近解决方案。您可以使用 iwatch 观看许多不同的事件 - 您感兴趣的事件是 close_write。语法:

iwatch -e close_write <directory_name>

这当然只有在写入完成后关闭文件时才有效,虽然这是一个理智的假设,但不一定是真的(但通常是这样)。

【讨论】:

谢谢,我也试过了。还尝试使用 inotifywait -e close_write 作为上传脚本中的“等待”。不幸的是,没有一个按预期工作。我猜是因为由于某种原因上传到 vsftpd 的文件没有正确“关闭”或“close_write”。我可能会在文件上尝试一些 hack-y 的东西,比如“ls -al”,然后等待 X 秒,直到文件大小停止变化,然后继续。不过,这似乎是一个可怕的解决方案 现在我决定不做我计划的事情并在文件上传到 FTP 后立即进行云同步,而是运行每小时一次的 cron 来将文件上传到云存储,如果它没有看到已经存在的文件。因此,如果不是最佳解决方法,也是可以接受的。

以上是关于linux - 监视目录中的新文件,然后运行脚本的主要内容,如果未能解决你的问题,请参考以下文章

Python 系统的基准测试系统性能

如何为 Linux 目录中的所有文件运行脚本? [复制]

使用 inotifywait 监视多个目录并运行脚本

用于监视新文件目录的 bash 脚本

redis在linux的安装和开机启动

怎么安装部署OSA运维管理平台 linux 运维 服务器管理