业务背景:两个Linux机器需要实时更新同步一个指定目录下内容,具体内容如下:
机器A:192.168.1.10
机器B:192.168.1.20
前提两个内网机器可以免密登录
1、安装工具
sudo apt-get update
安装rsync和inotify-tools
rsync:一个快速且灵活的文件复制工具,它可以同步两个目录之间的文件差异,只复制变化的文件部分。
inotify-tools:一个文件系统事件监控机制,允许你监视文件系统的变化,如创建、删除、修改等。
安装命令:
sudo apt-get install rsync inotify-tools
机器A、B需要都安装这个两个工具
2、编写脚本sync.sh
#!/usr/bin/env bash
# 定义源和目标目录
SOURCE_DIR="/home/software/app/temp"
DEST_HOST="root@192.168.1.20"
DEST_DIR="/home/software/app/temp"
LOG_FILE="/home/software/app/fsync/log/rsync.log"
# 首次全量同步
echo "Initial full sync..."
rsync -az --delete --log-file="$LOG_FILE" "$SOURCE_DIR/" "$DEST_HOST:$DEST_DIR"
# 监听并同步变更
echo "Watching for changes in $SOURCE_DIR..."
inotifywait -mrq \
-e create,delete,modify,move \
--format '%w%f' \
"$SOURCE_DIR" | while read CHANGED_FILE; do
echo "Detected change: $CHANGED_FILE"
rsync -az --delete --log-file="$LOG_FILE" "$SOURCE_DIR/" "$DEST_HOST:$DEST_DIR"
done
3、运行脚本
可以直接运行
./sync.sh
或者是守护进程运行
nohup ./script.sh > /log/fsync.log 2>&1 &
nohup ./sync.sh > fsync.log 2>&1 &
等同于
nohup ./sync.sh > fsync.log 2>fsync.log &">"符号用于将命令的`标准输出`重定向到指定的文件中
> fsync.log 表示将终端输出保存到 fsync.log文件中
"2>"表示将命令的`标准错误`输出重定向到指定的文件中
2>&1 表示将命令的标准错误输出重定向到标准输出1中一起输出
& 后台挂起
✅查看进程
ps -ef | grep sync.sh
或者是
ps -aux | grep "sync.sh"
a: 显示所有程序
u: 以用户为主的格式来显示
x: 显示所有程序,不区分终端机
若是脚本有格式问题,则安装dos2unix 将脚本转换为 Unix 格式
sudo apt install dos2unix
dos2unix sync.sh
这样再执行脚本就不会报错了!也就可以正常同步目录下的内容了。