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