如何跳过无响应的服务器

如何跳过无响应的服务器

我编写了一个在多个服务器上运行的脚本。有时脚本会挂在其中一台服务器上,我必须点击(控制 C)来结束该进程。如果没有,它就会卡住并继续尝试连接。

如果/当服务器在运行脚本时挂起或无响应时,是否有办法跳过该主机,以便脚本可以转到下一个主机并继续运行?通常当我点击 Control C 时,整个过程就会结束。

这是脚本的示例。假设它挂在机器 3 上。

HOSTS=(MACHINE1 MACHINE2 MACHINE3 MACHINE4 MACHINE5)
for i in "${HOSTS[@]}"
do
  echo "$i"
  ssh -q "$i" uname -a
 done

该脚本正在 OS X 上运行。我尝试使用该timeout命令,但不幸的是,它不起作用。

答案1

与其自己动手并必须应对所有可能出错的情况(主机无响应、主机在中间停止响应、用户按 Ctrl+C、错误报告等),不如使用其中之一许多现有工具可通过 SSH 在多台计算机上运行命令

mussh -t 4 -H <(printf '%s\n' "${HOSTS[@]}") -c 'uname -a'
pssh -t 4 -h <(printf '%s\n' "${HOSTS[@]}") uname -a
pdsh -u 4 -w "$(printf %s, "${HOSTS[@]}")" 'uname -a'

答案2

执行此操作的典型方法是使用陷阱命令告诉 shell 脚本忽略 SIGINT(由 Control-C 生成),然后在命令运行之前在子 shell 中重新启用 SIGINT。

trap "" INT
HOSTS=(MACHINE1 MACHINE2 MACHINE3 MACHINE4 MACHINE5)
for i in "${HOSTS[@]}"
do
    echo "$i"
    (trap - INT; ssh -q "$i" "uname -a")
done

相关内容