Bash脚本:监视热文件夹和部分文件

我有一个通过FTP上传文件的客户,我制作了一个基本上监视ftp文件夹并在生产机器上移动文件的脚本。 如何在启动我的scp命令之前检查文件是否已经通过ftp完全从客户端传输过来,以避免传输部分文件?

如果你的操作系统支持它,你可以看看incrond 。 可以监控的事件在incrontab中定义。也许你正在寻找的事件是

IN_CLOSE_WRITE为打开而打开的文件已closures(*)

或结合使用

IN_CREATE在监视目录(*)中创build的文件/目录

注意

在监视目录时,…上述事件可能发生在目录中的文件中,在这种情况下,返回的事件数据中的名称字段标识目录中文件的名称。

如果没有客户的帮助,你无法从bash中正确地做到这一点。

在FTP服务器端,有一些FTP服务器在上传终止后有运行程序的方法(可能已经完成,或者客户端可能已经断开连接,FTP服务器无法知道是否真的完成了)。

要做到这一点,最好的解决办法是让客户端用临时名称上传文件,然后在文件名称正确后重命名该文件。 然后你从处理中排除所有名为“whatever.tmp”的文件。 否则,请客户端上传一个零字节的locking文件,上传真实文件,然后删除locking文件。 然后您可以检查locking文件的存在

 filelist = ... if [ -e /home/ftp/incoming/lockfile ]; then exit; fi ... process $filelist ... 

如果客户端上传了很多,那么每次运行脚本时locking文件都可能在那里,而且什么都不会完成。 在这种情况下,你必须检查文件的时间戳与锁文件。 早于lockfile的文件应该是完整的:

 for f in ...; do if [ ! -e /home/ftp/incoming/lockfile -o $f -ot /home/ftp/incoming/lockfile ]; then ... process $f fi done 

如果你的FTP服务器和你的客户都不会和你一起参与,你可以做类似的事情

  1. 创build一个文件和文件大小的列表。
  2. 将此列表与以前的文件列表进行比较
  3. 处理当前列表中与上一个列表中的文件相同的文件
  4. 保存当前列表的文件
  5. 等5分钟再回到1。

在5分钟内没有变大的文件可能会像他们将要得到的那样完成。 这样做是为了给读者留下一个练习。

我使用的解决scheme(这当然不是防弹的,但是到目前为止我已经为我工作了100%)每隔10秒查询一次文件的大小,如果自上次查询以来没有改变,假设它是完成并开始转移。

当然,networking可能会有10多秒的传输,但是它并没有完成所有的传输,但这是非常罕见的事情,这就是MD5的校验和。