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

问题描述 投票:0回答:3

我想监视Ubuntu 14.04中的一个目录,当该目录中创建新文件时,运行一个脚本。

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

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

我可以在云上传脚本中添加“等待”,但这似乎很麻烦,并且无法预测等待多长时间,因为它取决于文件大小、网络条件等。

有什么更好的方法吗?

linux upload ftp cloud watch
3个回答
18
投票

虽然评论中提到了

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 在标准输入接收到每一行后运行。

1
投票

你已经接近解决问题了。您可以使用 iwatch 观看许多不同的活动 - 您感兴趣的是

close_write
。语法:

iwatch -e close_write <directory_name>

当然,只有在写入完成后关闭文件的情况下,这才有效,虽然这是一个合理的假设,但它不一定是正确的(但通常是这样)。


0
投票

这是通过向给定 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
© www.soinside.com 2019 - 2024. All rights reserved.