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

我想在Ubuntu 14.04中观察一个目录,当在这个目录下创build一个新文件时,运行一个脚本。

具体来说,我有安全摄像头,通过FTP上传捕获video时,他们检测到议案。 我想在这个FTP服务器上运行一个脚本,这样当新文件被创build时,它们立即被镜像(上传)到存储服务,这是通过我已经写好的脚本完成的。

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

我可以在云端上传脚本中添加一个“等待”,但似乎很难预测,因为这取决于文件大小,networking条件等等,所以无法预测需要等待多长时间。

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

尽管在评论中提到了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选项是监视器模式,每个事件输出一行到标准输出
  • -e close_write用于写入文件的文件关闭事件。 文件关闭事件希望避免接收不完整的文件。
  • /tmp/upload可以用其他一些目录替换来监视
  • gawk的管道重新格式化inotifywait输出行以删除第二列,这是事件类型的重复。 它将第1列中的dirname与第3列中的文件名结合起来,形成一个新的行,每一行都被刷新以打败缓冲并鼓励xargs立即行动
  • xargs获取文件列表,并为每个文件运行给定的命令,并在命令末尾附加文件名。 -L 1导致xargs在标准输入接收的每一行之后运行。

你接近那里的解决方案。 你可以用iwatch观看许多不同的事件 – 你感兴趣的是close_write 。 句法:

 iwatch -e close_write <directory_name> 

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