linux - 查看新文件的目录,然后运行脚本

时间:2016-01-22 23:12:29

标签: linux upload ftp cloud watch

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

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

我找到iWatch让我这样做(http://iwatch.sourceforge.net/index.html) - 我遇到的问题是iwatch立即在FTP目录中创建文件时启动云上传脚本,即使文件是正在上传的过程中。这会导致云同步脚本上传0字节文件,对我来说没用。

我可以添加等待'在云上传脚本中可能但看起来很糟糕,无法预测等待多长时间,因为它取决于文件大小,网络条件等。

什么是更好的方法呢?

2 个答案:

答案 0 :(得分:1)

虽然评论中提到了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在标准输入上收到的每一行之后运行。

答案 1 :(得分:0)

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

iwatch -e close_write <directory_name>

这当然只有在写作完成后文件被关闭时才有效,虽然这是一个理智的假设,但它不一定是真实的(但往往是)。