繁体   English   中英

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

[英]linux - watch a directory for new files, then run a script

我想看Ubuntu 14.04中的一个目录,当这个目录下新建一个文件时,运行一个脚本。

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

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

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

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

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

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

会跑

  yourCommandHere /tmp/upload/filename

何时关闭新上传的文件

笔记:

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

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

iwatch -e close_write <directory_name>

这当然只有在写作完成时文件被关闭时才有效,虽然这是一个理智的假设,但它不一定是真实的(但往往是)。

这是通过向给定的 URL 发出 POST 请求来响应文件系统事件的另一个版本。

#!/bin/bash
set -euo pipefail
cd "$(dirname "$0")"

watchRoot=$1
uri=$2

function post()
{
    while read path action file; do
        echo '{"Directory": "", "File": ""}' |
        jq ".Directory |= \"$path\"" |
        jq ".File |= \"$file\"" |
        curl --data-binary @- -H 'Content-Type: application/json' -X POST $uri || continue
    done
}

inotifywait -r -m -e close_write "$watchRoot" | post

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM