我的情况:我想将文件从一台电脑复制到另一台电脑。不幸的是,这个文件不完整。有一个过程正在将数据附加到这个文件(仅在最后)。
有没有一种方法可以轻松地复制此文件,而不必每次复制工具认为完成时都从头开始?
例如,是否有可能告诉 scp/rsync/whatever 等工具在下载完成后等待 20 秒 - 如果文件发生变化,只需下载这一额外的数据?
或者有没有办法让下载从字节 X 开始?
有人知道解决办法吗?提前谢谢!
答案1
最好的方法是让创建文件的进程同时创建远程文件。要么直接写入远程位置,要么使用类似方法将tee
数据同时传输到ssh
连接和本地文件。不过,这应该在启动进程时完成。
由于文件已经创建,所以您可以使用rsync
它。默认情况下,rsync
只复制更新的数据,因此如果您rsync
每隔几分钟运行一次,您就会得到您想要的。您可以使用强力方法:
while :; do rsync -u source destination; sleep 20; done
它将无限循环运行,只有不同时才会复制source
到。创建文件的过程完成后,您可以使用+停止它。destination
source
CtrlC
更优雅的方法是监视文件。如果正在创建machineA
并复制到machineB
,您可以从以下位置执行此操作machineB
(假设您已ssh
设置无密码):
while [[ $(ssh machineA md5sum < /path/to/file) != $(md5sum < /path/to/file) ]] do
rsync -uv aa b
sleep 20
done
请注意,当两个文件第一次相同时,此操作将停止。如果您的文件创建过程超过 20 秒没有写入然后恢复,则必须再次手动复制。
答案2
你可能会考虑使用因克龙为您同步当文件改变时运行,即修改中,如果您需要的是长期文件同步。
http://www.linux-magazine.com/Issues/2014/158/Monitoring-with-incron
http://www.cyberciti.biz/faq/linux-inotify-examples-to-replicate-directories/
http://manpages.ubuntu.com/manpages/intrepid/man5/incrontab.5.html
如果是短期的,terdon 的最后一个 while 循环可能会更快地设置。