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