有两台 RHEL 7.2 linux 服务器位于不同的地方。两者具有相同的目录结构。要求是保持两台服务器的某些目录同步,即 server1 中的任何修改都应反映在 server2 中,反之亦然,但如果某些文件在本地被删除,则不应该也从远程服务器中删除。如果在这两个服务器之间的链接断开时某些文件被修改,则应在链接建立后立即复制它。要实现以下脚本,请执行以下操作:
#!/bin/bash
EVENTS="CREATE,MOVED_TO,MODIFY"
inotifywait -e "$EVENTS" -m -r --format '%w%f' --fromfile list.txt|
while read FILE; do
echo $FILE
returnvalue=1
while [[ $returnvalue -ne 0 ]]
do
rsync -azr $FILE backupserver:/$FILE
returnvalue=$?
echo $returnvalue
if [[ $returnvalue -ne 0 ]]
then
sleep 60
fi
done
done
list.txt包含所有要监控的目录。这是在两台服务器上运行的脚本。
问题 : 每当在 server1 中进行某些修改时,它都会检测到并将其复制到 server2返回码0。但是在 server2 中检测到这是新的修改,并且它尝试复制回 server1,因为该文件存在于 server1 中 rsync 返回错误代码23,因此程序会卡住。
这个问题的最佳解决方案是什么?
笔记:我们不能使用 --ignore-existing 选项,因为两个地方都存在相同的文件,如果内容发生更改,则需要更新该文件。
答案1
** 首先想到这可能是 rsync 选项问题 ** 现在我的想法不同了!
答案:使用本地锁来索取复制权
如果您没有一个目录,我建议进行一个简单的测试 - 首先 - 只需使用默认值,然后看看哪里不能按预期工作。
**删除了rsync的东西**
好的 - 备份 4 个步骤,然后再看一次。
也许问题是循环逻辑:
- ServerA 有更改(更改为 LARGEFILE),它开始复制它。
- 现在,在 ServerB 上,LARGEFILE 在 rsync/rcp 复制期间是新的/修改的,并尝试“立即”将其复制回来
我怀疑这种“即时性”是问题的根源。
我的建议是添加某种类型的“LOCK”文件:
- 将锁放置在本地
- 检查远程锁定,如果在远程找到,则删除本地锁定并忽略本地 inotify
- 如果在远程找不到,则开始文件复制,复制完成后删除锁定
答案2
MODIFY
您可以通过等待(打开可写后关闭的文件)来代替等待事件close_write
,这将确保您不会尝试 rsync 仍在更改的文件。
答案3
该问题是由于其他答案中建议的临时文件创建造成的。当我添加后就解决了--temp-dir=/tmp作为 rsync 选项。