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