当尝试访问无法访问的服务器时,使 SSH 超时更快

当尝试访问无法访问的服务器时,使 SSH 超时更快

我编写了一个脚本来关闭我们环境中的所有服务器。但是,如果某些服务器一开始就无法访问或者它已经关闭,我的脚本就会挂起并且什么也不会发生。如果某些服务器无法访问,我该如何让它继续前进?

#!/bin/bash
#script for Shutting down all VM & BM.
Region=$1
user=$2
region_file_path="/region/$Region.txt"
host=`cat $region_file_path`
key_path="/root/.ssh/id_rsa_adminpod"
for i in $host
do
#       echo "Shutting down Host in $Region with ip addrss $i"
        ssh -i $key_path -p 2222 $user@$i "sudo init 0" &> /dev/null
        if [ $? -ne  0 ]; then
           echo "$i is shutdown!"
        else
           echo "There is some issue, try again"
           exit 1
        fi
done

答案1

最简单的解决方案是将连接超时设置为某个合理的时间。

ssh -o ConnectTimeout=10 -i $key_path -p 2222 $user@$i "sudo init 0" &> /dev/null

10秒应该足够了。

您还可以使用一些其他工具来自动化任务 - 即 Ansible。

答案2

使用 Ansible 的解决方案如下。

0) 确保已启用管理节点和要关闭的节点之间的 SSH 无密码访问。

1) 准备简单的清单文件,其中包含应关闭的节点。有示例内容:

[local]
localhost ansible_connection=local

[nodes]
192.168.1.30
192.168.1.40

2) 运行 ansible shell 模块,并将清单文件指定为参数和关闭命令:

ansible -i /tmp/hosts -m shell -a "/usr/sbin/shutdown +1" nodes

关闭指定了 1 分钟延迟,因此连接不会立即终止。但也许不需要。

这只是示例,您可以使用想要在多个节点上并行运行的任何其他命令。

答案3

如果您有“不响应”依赖项,您可以继续不使用exit 1,并多次重试ssh连接:

for i in $host
do
        counter=0
        while [ $counter -ne 3 ]; do
        #       echo "Shutting down Host in $Region with ip addrss $i"
                ssh -o ConnectTimeout=10 -i $key_path -p 2222 $user@$i "sudo init 0" &> /dev/null
                if [ $? -ne  0 ]; then
                   echo "$i is shutdown!"
                   counter=3
                else
                   echo "There is some issue, try again"
                   counter=$(($counter+1))
                fi
        done
done

答案4

似乎有一个名为“超时”的本机 bash 命令https://man7.org/linux/man-pages/man1/timeout.1.html

相关内容