脚本逻辑 第一次会下载,第二次比较如果有就不下载
文件已存在:
如果目标目录中已经存在同名文件,rsync 会比较源文件和目标文件的大小和修改时间。
如果源文件和目标文件的大小和修改时间完全相同,rsync 会跳过该文件,不会重新下载。
如果源文件和目标文件的大小或修改时间不同,rsync 会重新下载并覆盖目标文件。
文件不存在:
如果目标目录中不存在同名文件,rsync 会直接下载该文件。
下载
https://sourceforge.net/projects/sshpass/files/sshpass/1.10/
链接2
RPM resource sshpass
在服务器A上面执行 把压缩包上传到你要放的目录
tar xvzf sshpass-1.10.tar.gz
cd sshpass-1.10
./configure
make
make install
sshpass -V
卸载
cd sshpass-1.05/
make uninstall
make clean
脚本内容,名称自己起,假设除了ip其它都一致
#!/bin/bash# 服务器信息
SERVER_USER="1"
SERVER_PORT="2"
SERVER_PASSWORD="xx"
REMOTE_DIR="/f1/"
LOCAL_DIR="/fdown/"
LOG="/opt/xx.log"# 服务器 IP 地址
1_HOST="10.1" # 服务器1
2_HOST="10.2" # 服务器2# 初始化文件计数器
TOTAL_FILES=0# 下载函数
download_files() {local host=$1echo "正在从 $host 下载文件..." | tee -a "$LOG"# 获取远程目录中的文件列表file_list=$(sshpass -p "$SERVER_PASSWORD" ssh -p $SERVER_PORT $SERVER_USER@$host "ls $REMOTE_DIR")if [ $? -ne 0 ]; thenecho "$(date): 无法获取 $host 的文件列表" | tee -a "$LOG"exit 1fi# 统计文件数量file_count=$(echo "$file_list" | wc -l)TOTAL_FILES=$((TOTAL_FILES + file_count))# 使用 rsync 下载文件,并记录文件名echo "以下文件将从 $host 下载:" | tee -a "$LOG"echo "$file_list" | tee -a "$LOG"sshpass -p "$SERVER_PASSWORD" rsync -avz -e "ssh -p $SERVER_PORT" $SERVER_USER@$host:$REMOTE_DIR/ $LOCAL_DIRif [ $? -eq 0 ]; thenecho "$(date): 从 $host 下载文件成功" | tee -a "$LOG"echo "下载文件数量: $file_count" | tee -a "$LOG"elseecho "$(date): 从 $host 下载文件失败" | tee -a "$LOG"exit 1 # 失败时退出脚本fi
}# 无限循环,每 1 小时执行一次
while true; do# 从服务器1下载文件download_files "$1_HOST"# 从服务器2下载文件download_files "$2_HOST"echo "$(date): 所有文件下载完成" | tee -a "$LOG"echo "总下载文件数量: $TOTAL_FILES" | tee -a "$LOG"# 休眠 1 小时sleep 3600
done
赋权 chmod +x 脚本
执行 脚本.sh
把脚本加入自启动
创建一个新的 systemd 服务单元文件:
sudo vim /etc/systemd/system/ziqidong.service
在打开的文件中添加以下内容:
[Unit]
Description=Process Watchdog Service
After=network.target
[Service]
Type=simple
ExecStart=/opt/watchdog/ziqidong.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
一定要赋权
chmod -R 777 脚本目录
重新加载 systemd 配置:
sudo systemctl daemon-reload
设置开机自启动:
sudo systemctl enable ziqidong.service
启动服务:
sudo systemctl start ziqidong.service
# 关闭 docker 后台服务
# 如果提示“Warning: Stopping docker.service, but it can still be activated by: docker.socket”,则执行 systemctl stop docker.socket 即可
sudo systemctl stop ziqidong.service
# 重启 docker 服务
sudo systemctl restart ziqidong.service
检查服务状态:
sudo systemctl status ziqidong.service