如何在6台服务器先并行执行command1/2,再执行command3/4?
完善后的Shell脚本实现
我懂你的需求:要让6台服务器各自并行跑command1和command2,等所有这些远程命令全部执行完毕后,再启动本地的command3和command4。下面是补全并优化后的完整脚本:
#!/bin/sh # 实例详情:用数组统一管理服务器列表,比单独定义变量更易维护 Servers=( "<Server1>" "<Server2>" "<Server3>" "<Server4>" "<Server5>" "<Server6>" ) # 遍历所有服务器,并行启动每台机器的command1和command2 for server in "${Servers[@]}"; do ssh root@"$server" "command1" & ssh root@"$server" "command2" & done # 等待所有后台运行的ssh进程全部完成 wait # 所有远程命令执行结束后,运行本地的command3和command4 command3 command4
关键逻辑说明:
- 数组管理服务器:把6台服务器放进数组里,后续要增减机器时,直接修改数组即可,不用重复写大量重复的ssh命令。
- 后台并行执行:每个
ssh命令后加&,让远程命令在后台运行,这样所有服务器的command1和command2会同时启动,最大化执行效率。 wait命令的核心作用:这个命令会暂停脚本执行,直到所有后台启动的进程(也就是所有远程ssh任务)都执行完成,完美实现“等所有远程命令跑完再走下一步”的要求。- 本地命令执行:
wait返回后,就可以安全执行command3和command4了,如果想让这两个本地命令也并行,给它们后面加&,再补一个wait就行。
如果需要校验远程命令的执行结果(比如某个服务器的命令失败就终止后续流程),可以给ssh命令添加退出码检查,不过如果只需要等待所有命令执行完毕(不管成功与否),上面的脚本就完全够用。
内容的提问来源于stack exchange,提问作者goe
相关产品推荐
相关产品推荐

