我有一个虚拟机集群,在 CentOS7 上有 3 个节点,在 RHEL7 上有 1 个节点。在crontab中有一个启用rsync的目录,/mnt/<server_IP>/portal/wso2telcohub-3.0.2/repository/deployment/server/synapse-configs/default/api/
设置如下。
$ incrontab -l
/mnt/<server_IP>/portal/wso2telcohub-3.0.2/repository/deployment/server/synapse-configs/default/api/ IN_MODIFY,IN_ATTRIB,IN_CREATE,IN_DELETE /mnt/rsync/rsync-for-carbon-depsync.sh
启用调试的 rsync 脚本
#!/bin/sh -ex
#source folder
portal=/mnt/<server_IP>/portal/wso2telcohub-3.0.2/repository/deployment/server/synapse-configs/default/
#Destination folder
gateway=/mnt/<server_IP>/gateway/wso2telcohub-3.0.2/repository/deployment/server/synapse-configs/default
LOG=/log/rsync/carbon-rsync-logs/"log-local-$(date +%Y%m%d_%H%M%S).log"
echo "entered the script" >> $LOG
#keep a lock to stop parallel runs
(
echo "entered the flock" >> $LOG
flock -e 10
echo "Obtained the lock" >> $LOG
echo " ========== $(date -Iseconds) Lock acquired by local thread <server_IP>< =========== " >> $LOG
rsync --delete -arv $portal $gateway >> $LOG
) 10> /var/rsync/.rsync.lock
echo " ========== $(date -Iseconds) Release Lock acquired by local thread <server_IP> =========== " >> $LOG
下面是日志文件
entered the script
entered the script
基本上,无论所做的更改都portal
应该反映在gateway
.我在portal
目录中创建了一个临时文件。但它不会反映在gateway
目录中。这仅适用于新的 RHEL 7 VM。旧的 CentOS 7 VM 使用相同的脚本可以正常工作。
答案1
/tmp/errors
我建议您通过在第二行添加新命令来启用向日志文件报告错误。稍微扩展一下,我们进行了此修改,将预期输出和意外错误捕获到单个文件中/tmp/output
:
#!/bin/sh -ex
exec >/tmp/output 2>&1
#source folder
portal=/mnt/<server_IP>/portal/wso2telcohub-3.0.2/repository/deployment/server/synapse-configs/default/
...
在生产环境中,人们会写入更好定义的日志文件,甚至使用系统记录器(man logger
了解详细信息)。
shell-e
标志会使其在执行返回非成功状态(非零退出代码)的命令后立即退出。错误日志将捕获 shell 退出时因任何错误而生成的输出。该-x
标志启用跟踪 - 也可以跟踪日志文件。
在一个评论你决定,“/var
RHEL 7内部没有 rsync 目录”。
因此,您的脚本无法在 RHEL 7 上运行的原因是您尚未创建脚本所需的目录。该脚本尝试写入,/var/rsync/.rsync.lock
但无法执行此操作,因为父目录不存在。
解决方案是创建该目录并确保执行脚本的 UID 可以写入该目录。更好的是,修改脚本以创建该目录(如果该目录尚不存在),或者以某种可以捕获并提供给真人的方式报告此错误。