嗨,我有两台 linux 机器。服务器 A (LUbuntu) 和服务器 B (Raspbian)。我想要做的是让服务器 A 从服务器 B 中检查特定的目录(NFS 安装在 A 上),并且如果有任何文件将它们传输到服务器 A 上的某个位置。理想情况下,在传输之后,B 上的所有传输文件都将被删除. 请注意,我不想同步 A 和 B,也不想从 A--->B 进行任何传输,而只希望从 B--->A 进行传输。理想情况下,我不想传输重复的文件,而只是删除它们。
在没有太多脚本的情况下实现这一目标的最佳方法是什么?由于 A 并非一直在线,因此恢复文件传输很重要。
是否有任何现有的软件可以做到这一点,或者我必须自己编写所有脚本。
谢谢
我建议rsnapshot。
它是一个 perl 基础脚本,已经为您编写好了脚本,只需编辑其
/usr/local/etc/rsnapshot.conf
文件并指定副本的源和目标即可。然后你运行
/usr/local/bin/rsnapshot
的是我认为可执行文件被放置的地方自动运行:
crontab -e
并执行类似的操作crontab 语法是:
根据我的 crontab 语法,将在每天中午 12:00 运行指定的任何内容
阅读有关 rsnapshot perl 脚本的日常输入参数的 rsnapshot 说明
rsnapshot 可以在任何内容之间进行复制,前提是您设置了所需的所有内容 [在说明中描述]
该方案的基本缺陷是主机 B 无法知道何时可以安全地复制文件。如果 A 正在将文件写入 NFS 共享目录,而主机 B 在该文件完全写入之前获取该文件怎么办?主机 B 将复制部分文件,如果该(部分)复制成功,它将删除整个文件,包括它没有复制的部分,因为主机 A 尚未完成写入。
也就是说,这似乎是一个相当简单的
rsync
. 阅读man
页面,尤其是--partial
选项,也许是--checksum
选项,尤其是关于选项部分的警告--remove-source-files
。建议的使用文件名的解决方法,例如*.new
当主机 A 写入要由主机 B 复制的文件,然后将.new
文件重命名为其应有的名称时,可能对您有用。在单个文件系统中重命名通常是原子操作,因此主机 B 只需耐心等待并忽略任何 *.new 文件。一旦它们被重命名,主机 B 将在下次cron
作业运行时转移它们。