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 - 监视目录中的新文件,然后运行脚本的主要内容,如果未能解决你的问题,请参考以下文章