我想在Ubuntu 14.04中查看目录,当在此目录中创建新文件时,运行脚本。
具体而言,我有安全摄像头,当他们检测到动作时,通过FTP捕获的视频上传。我想在这个FTP服务器上运行一个脚本,所以当创建新文件时,它们会立即被镜像(上传)到云存储服务,这是通过我已编写的脚本完成的。
我找到iWatch让我这样做(http://iwatch.sourceforge.net/index.html) - 我遇到的问题是iwatch立即在FTP目录中创建文件时启动云上传脚本,即使文件是正在上传的过程中。这会导致云同步脚本上传0字节文件,对我来说没用。
我可以添加等待'在云上传脚本中可能但看起来很糟糕,无法预测等待多长时间,因为它取决于文件大小,网络条件等。
什么是更好的方法呢?
答案 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>
这当然只有在写作完成后文件被关闭时才有效,虽然这是一个理智的假设,但它不一定是真实的(但往往是)。