我想监视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 软件包 inotify-tools
的一部分。它使用内核inotify服务来监视文件或目录事件-m
选项是监控模式,每个事件输出一行到标准输出-e close_write
用于打开用于写入的文件的文件关闭事件。文件关闭事件希望避免接收不完整的文件。/tmp/upload
可以替换成其他目录来监控gawk
的管道重新格式化 inotifywait
输出行以删除第二列,这是事件类型的重复。它将第 1 列中的目录名与第 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