[英]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.