如何将串行执行的服务器Users目录tar备份脚本改为并行执行?
实现多服务器并行备份的方案
方法1:直接将任务放到后台执行(最简单修改)
你可以把每个ssh命令放到后台运行(加&),最后用wait命令等待所有后台任务完成,这样所有服务器的备份操作就会同时启动。修改后的脚本如下:
#!/bin/ksh print "===========================================" print "Taking backup of Users dir" print "===========================================" serverList="DEV_Servers.txt" # 存储后台进程ID的数组 pids=() while read -r server; do print print "===========================================" print "Starting Backup of Users on:" $server # 将ssh命令放入后台执行,并记录进程ID ssh -o StrictHostKeyChecking=no -n $server "cd /opt/test/ ; tar -zcvf 'Users$(date '+%Y%m%d').tar.gz' Users" & pids+=($!) done < "$serverList" # 等待所有后台进程完成 print "Waiting for all backups to finish..." for pid in "${pids[@]}"; do wait $pid done print "All backups completed."
注意:原脚本里的$(date '+%Y%m%d')是在本地执行的,所以所有服务器的备份文件名会使用本地机器的日期。如果需要用目标服务器的日期,要调整引号让date在远程执行:
ssh -o StrictHostKeyChecking=no -n $server 'cd /opt/test/ ; tar -zcvf "Users$(date '+%Y%m%d').tar.gz" Users' &
方法2:使用xargs控制并行数
如果服务器数量较多,不想一次性启动太多SSH连接(可能触发目标服务器的连接限制),可以用xargs指定并行执行的数量:
#!/bin/ksh print "===========================================" print "Taking backup of Users dir" print "===========================================" serverList="DEV_Servers.txt" # -P 4 表示同时运行4个进程,可根据实际调整 xargs -P 4 -I {} -a "$serverList" sh -c ' echo "===========================================" echo "Starting Backup of Users on: {}" ssh -o StrictHostKeyChecking=no -n {} "cd /opt/test/ ; tar -zcvf Users$(date '+%Y%m%d').tar.gz Users" ' echo "All backups completed."
方法3:使用GNU Parallel(更灵活的并行工具)
如果系统安装了GNU Parallel,可以更方便地管理并行任务,支持日志、错误处理等功能:
#!/bin/ksh print "===========================================" print "Taking backup of Users dir" print "===========================================" serverList="DEV_Servers.txt" # --jobs 4 指定并行数,--verbose 显示执行详情 parallel --jobs 4 --verbose ssh -o StrictHostKeyChecking=no -n {} "cd /opt/test/ ; tar -zcvf Users$(date '+%Y%m%d').tar.gz Users" :::: "$serverList" echo "All backups completed."
额外注意事项
- 输出混乱问题:多个后台任务同时输出会导致日志混乱,建议将每个服务器的备份输出重定向到单独的日志文件,比如在ssh命令后加上
> ${server}_backup.log 2>&1。 - SSH连接限制:部分服务器会限制同时的SSH连接数,需要根据目标服务器的配置调整并行数量,避免被拒绝连接。
- 权限问题:确保执行脚本的用户在所有目标服务器上有
/opt/test/目录的读写权限,以及tar命令的执行权限。
内容的提问来源于stack exchange,提问作者Engineer83
相关产品推荐
相关产品推荐

