You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将串行执行的服务器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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:02:19