2012-04-15 56 views
6

我有一个视频编码脚本,我希望在文件移入特定目录后立即运行该脚本。将文件移动到另一个目录完成传输

如果我使用类似inotify的东西,我如何确保文件在编码移动之前不被编码?

我认为做这样的事情:

  • 副本(rsync的)文件到一个临时目录。
  • 完成后,将(简单'mv')移动到编码目录中。
  • 让我的脚本监视编码目录。

但是,如何让步骤2正常工作并且只有在#1完成后才运行?

我使用的是Ubuntu Server 11.10,我想使用bash,但如果这可以简化问题,我可以说服他们使用Python。

我不是“下载”文件到这个目录,本身;相反,我会在绝大多数时间使用rsync。

此外,此Ubuntu服务器运行在虚拟机上。

我的主要文件存储通过NFS从FreeBSD服务器上挂载。

回答

1

我使用的一种技术与FTP一起工作。您向FTP服务器发出命令以将文件传输到辅助目录。命令完成后,您会向服务器发送第二条命令,这次告诉它将文件从aux目录重命名为最终的目标目录。如果您正在使用inotify或轮询目录,则文件名将不会显示直到重命名完成,因此,您可以保证文件完整。

我不熟悉rsync,所以我不知道它是否具有类似的重命名功能。

+0

rsync以同样的方式工作 - 文件不会显示在要编码的文件列表中,直到完成传输。 – javanix 2012-05-03 14:27:58

2

最简单的方法是使用像wgetcurl这样的程序进行下载,该程序在文件完成下载之前不会退出。如果做不到这一点,我不知道这是否是绝对的最佳解决方案,但你可以使用一个脚本,循环,检查使用lsofgrep文件是否打开:

while lsof | grep /path/to/download >/dev/null; do sleep 5; done 
mv /path/to/download /path/to/encode/dir 
+0

这应该在一个捏,但我想尽量避免投票。 – javanix 2012-04-16 13:59:44

0

inotifywait看起来很有希望。您必须小心谨慎,因为如果下载在通知设置之前完成,它将永远等待。

inotifywait -e close_write "$download_file" 
mv "$download_file" "$new_location" 
相关问题