批量重启脚本循环 ssh 到 20 台机器执行 systemctl restart,3 台返回 connection refused,脚本最后 echo done 退出码 0,监控显示全部成功。日志里能对上时间点,这种反而好排。

循环里没有收集每台的退出码,最后一次 echo 覆盖了整体状态。ssh 失败的信息只在 stderr 里滚过去。这一点先确认清楚,后面就不用反复试。

fail=0
for h in $(cat hosts.txt); do
  ssh -o BatchMode=yes -o ConnectTimeout=5 "$h" 'systemctl restart app' || { echo "$h" >> failed.txt; fail=1; }
done
exit $fail

「ssh 批量执行失败」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

处理上按这个顺序:循环里逐台判断 ssh 的退出码并累加失败数;用 ssh -o BatchMode=yes 避免卡在密码提示;失败的机器单独输出到文件 方便重跑;整体退出码按失败台数返回 非 0 让任务系统标红。

结果对不对很好判断,有机器连不上时脚本退出码为 1,failed.txt 里能看到对应主机名。

作者 9823189