linux - 观察新文件的目录,然后运行脚本

Noo*_*Mac 7 linux cloud ftp upload watch

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

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

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

我可能会在云上传脚本中添加一个“等待”,但它似乎是hack-y并且无法预测等待多长时间,因为它取决于文件大小、网络条件等。

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

Pau*_*aul 7

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

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

会跑

  yourCommandHere /tmp/upload/filename
Run Code Online (Sandbox Code Playgroud)

当新上传的文件关闭时

笔记:

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


TNW*_*TNW 1

你已经接近解决方案了。您可以使用 iwatch 观看许多不同的活动 - 您感兴趣的就是您感兴趣的活动close_write。句法:

iwatch -e close_write <directory_name>
Run Code Online (Sandbox Code Playgroud)

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