我想在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>
这当然是有效的,只有当文件完成时文件关闭,虽然这是一个理智的假设,但它不一定是一个真正的(往往是)。