我正在使用本地网站将文件下载到我的服务器。使用 Inotify 守护程序,我正在监听特定文件夹(我要下载到的文件夹)中的文件更改,并执行脚本,使用 rsync 将这些文件移动到另一个文件夹中。但是,我的问题是 rsync 在文件完全下载之前就移动了文件,因此文件大小为 0KB。我以前使用过 mv,mv 设法等到下载完成后再移动,但我需要使用 rsync,因为 mv 不会写入现有的非空文件夹。
有任何想法吗?
这是我在 inotify create 上执行的脚本:
#!/bin/sh
cd the_folder_which_is_watched_by_inotify
rsync -vh * /where_the_files_are_moved_to
echo "Files have been moved"
答案1
mv 可能起作用的原因是,文件实际上是同一个文件。因此,上传过程将写入给定的 inode,而 mv 命令只是更新源和目标,以便 inode 位于不同的位置。但任何具有该文件的打开句柄的程序都可以继续使用该 inode,因此您可以将链接移动到您想要的任何位置。
您可能能够做的是使用 rsync--link-dest
选项。获取正确的道路是棘手的因为--link-dest
从目标的角度来看,需要源的相对路径。但它应该导致 rsync 建立到文件的硬链接。也就是说,源和目标都应该链接到完全相同的 inode。
答案2
您应该设置您的 inotify 守护进程以仅在组合事件上启动CLOSE_WRITE
rsync MOVE_FROM/MOVE_TO
。
如果您正在监听CREATE
和/或MODIFY
事件,则在写入文件时将以调用 rsync 结束,这将导致损坏/空的副本。