2016-01-22 39 views
3

我想观看Ubuntu 14.04中的目录,并且在此目录中创建新文件时,请运行脚本。linux - 观察新文件的目录,然后运行脚本

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

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

我可以添加在云中上传脚本可能是“等待”,但它似乎下锅y和无法预测需要等待多长时间,因为它取决于文件大小,网络条件等

请告诉我一个更好的办法去做这个?

回答

0

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

iwatch -e close_write <directory_name> 

当然这只有文件的时候写的完整的,它们虽然这是一个理智的假设,它不一定是一个真实的(但往往是)被关闭。

+0

谢谢,我也尝试过。还尝试使用inotifywait -e close_write作为上传脚本中的“等待”。不幸的是没有一个按预期工作。我猜是因为由于某些原因上传到vsftpd的文件没有正确的关闭或close_write。我可能会在文件上尝试一些像'ls -al'这样的hack-y内容,并等待X秒,直到文件大小停止更改,然后继续。看起来像一个可怕的解决方案,虽然 –

+0

现在我决定,而不是做我的计划和云同步文件,只要他们上传到FTP,我运行一个小时cron上传文件到云存储如果它没有看到已经存在的文件。因此,如果次优解决方案是可以接受的。 –

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软件包inotify-tools的一部分。它使用内核的inotify服务监控文件或目录事件
  • -m选项监控模式下,输出每个事件一行到标准输出
  • -e close_write对于那个曾经打开写入文件的文件关闭事件。文件关闭事件有望避免接收不完整的文件。
  • /tmp/upload可以与一些其他目录被替换以监测
  • 管到gawk重新格式化inotifywait输出线掉落第二列,该列是事件类型的重复。它结合了第1列的目录名与第3列中的文件名进行新线,这被刷新每行由xargs
  • xargs击败缓冲和鼓励立即采取行动,采取文件的列表,并为每个文件运行指定的命令,在命令的末尾附加文件名。 -L 1导致xargs在标准输入收到的每一行后运行。