小功能大用处 ---- 一键检测各服务器是否存活

工作中会遇到判断服务器是否存活的场景,比如:批量重启服务器后,各宿主机或虚拟机是否启动成功。

检测服务器是否存活的原理很简单:先检查服务器是否通(ping);如果不通则检查服务器上的服务是否通,如果服务也不通,则说明这台服务器没有开启。可以使用的工具有:ping、telnet、nmap或者tcping等。

nmap功能强大,用处广泛;tcping可以在服务器禁ping的情况下检查机器是否存活(比如windows机器默认就是禁ping的)。在这里,我用的是ping和telnet组合。

关于ping工具,合理的使用相关参数比较有利于排查问题,比如:"-c"参数可以用来限制发送ping多少个包,"-i"参数可以用来限制ping的频率等。举例:

ping -c2 -i0.02 www.baidu.com > /dev/null 2>&1

  上一段代码意思为:以0.02秒的间隔时间ping www.baidu.com 2次,并将结果(正确或错误)引入到“黑洞”(丢弃),合理的使用参数可以帮助我们快速判断目标主机是否可达。当然,会有人问:你将测试结果引入到黑洞,我怎么知道目标主机是通还是不通呢?这个时候可以通过判断操作状态得知,命令为:

echo $?

  如果上面的结果返回值为0,说明www.baidu.com可达,否则www.baidu.com可能不通,需要进行下一步再判断。有人说,通过手动执行命令麻烦,可否再精巧些?那就写成脚本吧,如下:

#!/bin/bash
# test.

ping -c2 -i0.02 www.baidu.com > /dev/null 2>&1
if [ $? -eq 0 ];then
    echo "Host can access ...."
else
    ...
fi

  解释上面那段脚本,如果主机不通,则执行后续动作,这些后续动作放在"else"代码块中,后续动作可以使用nmap、telnet等工具,这里介绍telnet。

有人会说,telnet容易,如果telnet程序一直卡在那里则说明服务器端口不通,然后通过“CTRL+c”终止就行了,但是怎样在脚本中使用telnet呢?简单,通过Linux的管道功能(“|”),可以让脚本沉睡一段时间,这段时间内telnet执行任务,待沉睡时间到期则终止telnet程序。话虽如此,怎样实现呢?如下:

(sleep 1;) | telnet www.baidu.com 80

  判断某台服务器是否存活,可以先ping IP,再telnet port,如果是测试一个IP,则可将脚本写成如下:

#!/bin/bash
# test.

host= www.baidu.com
port=80
telnet_file=/tmp/telnet_file.txt

ping -c2 -i0.02 $host > /dev/null 2>&1
if [ $? -eq 0 ];then
    echo "$host can access ...."
else
    (sleep 1;) | telnet $host $port > $telnet_file
    grep -B 1 \] $telnet_file > /dev/null 2>&1
    if [ $? -eq 0 ];then
        echo "$host can access ..."
    else
        echo "$host can not access !!!"    fi
fi

  上面的脚本是针对一个IP进行判断,说实话如果是判断一台服务器是否可达的话直接终端敲命令就知道了,不需要“大费周折”写脚本了,但是如果同时测试多台机器就需要用到脚本了。对于编写批量判断多台主机是否可达的脚本,只需要将上述思路稍作整理,灵活使用linux基础命令即可实现。当然,如果目标机器非常多的情况下,推荐使用ansible或者saltstack,或者干脆写个python多进程的脚本去判断。

下面贴出我之前基于ping和telnet工具写的脚本,大致原理和上面讲述的相似,在执行脚本前,请先编辑服务器配置文件。

执行脚本:

renxiaowei$ cat check.sh

#!/bin/bash
# 功能:一键检测宿主机、虚拟机是否存活
# 作者:任小为
# 版本:v1.0

file=server.txt
result_base=/tmp/check_host_net

rm -rf $result_base
mkdir -p $result_base

super_host(){
    super_ip_list=${result_base}/super_ip_list.txt
    super_alive=${result_base}/super_alive.txt
    super_die=${result_base}/super_die.txt
    super_telnet=${result_base}/super_telnet.txt

    echo ""
    echo -e "\033[44;36m检测宿主机是否存活... \033[0m"

    egrep -v "#|^$" $file | awk ‘{print $1,$2}‘ | uniq > $super_ip_list

    count=0
    for ip in $(cat ${super_ip_list} | awk ‘{print $1}‘);do
        let count++
        echo "count=$count"

        ping -c 2 -i 0.02 $ip > /dev/null 2>&1
        if [ $? -eq 0 ];then
            echo $ip >> ${super_alive}
        else
            super_port=`grep $ip ${super_ip_list} | awk ‘{print $2}‘`
            (sleep 1;) | telnet $ip ${super_port} >> ${super_telnet}
        fi
    done

    if [ -e ${super_telnet} ];then
        super_ip=${result_base}/super_ip.txt
        cat ${super_ip_list} | awk ‘{print $1}‘ > ${super_ip}

        cat ${super_telnet} | grep -B 1 \] | grep [0-9] | awk ‘{print $3}‘ | cut -d ‘.‘ -f 1,2,3,4 >> ${super_alive}
        cat ${super_ip} ${super_alive} | sort | uniq -u > ${super_die}
    fi

    echo ""
    echo -e "\033[32;49;1m存活的宿主机: \033[31;49;0m"
    echo -e "`cat ${super_alive}`\n"

    if [ -s ${super_die} ];then
        echo -e "\033[31;49;1m检测不通的宿主机:\033[31;49;0m"
        echo -e "\033[31;49;1m`cat ${super_die}`\033[31;49;0m\n"
    else
        echo -e "\033[44;36m所有宿主机都存活.\033[0m\n"
    fi
}

sub_host(){
    sub_ip_list=${result_base}/sub_ip_list.txt
    sub_alive=${result_base}/sub_alive.txt
    sub_die=${result_base}/sub_die.txt
    sub_telnet=${result_base}/sub_telnet.txt

    echo ""
    echo -e "\033[44;36m检测虚拟机是否存活... \033[0m"

    egrep -v "#|^$" $file | awk ‘{print $3,$4}‘ | uniq > $sub_ip_list

    sub_count=0
    for sub_ip in $(cat ${sub_ip_list} | awk ‘{print $1}‘);do
        let sub_count++
        echo "count=${sub_count}"

        ping -c 2 -i 0.02 ${sub_ip} > /dev/null 2>&1
        if [ $? -eq 0 ];then
            echo ${sub_ip} >> ${sub_alive}
        else
            sub_port=`grep ${sub_ip} ${sub_ip_list} | awk ‘{print $2}‘`
            (sleep 1;) | telnet ${sub_ip} ${sub_port} >> ${sub_telnet}
        fi
    done

    if [ -e ${sub_telnet} ];then
        sub_ip=${result_base}/sub_ip.txt
        cat ${sub_ip_list} |awk ‘{print $1}‘ > ${sub_ip}

        cat ${sub_telnet} | grep -B 1 \] | grep [0-9] | awk ‘{print $3}‘ | cut -d ‘.‘ -f 1,2,3,4 >> ${sub_alive}
        cat ${sub_ip} ${sub_alive} | sort | uniq -u > ${sub_die}
    fi

    echo ""
    echo -e "\033[32;49;1m存活的虚拟机: \033[31;49;0m"
    echo -e "`cat ${sub_alive}`\n"

    if [ -s ${sub_die} ];then
        echo -e "\033[31;49;1m检测不通的虚拟机:\033[31;49;0m"
        echo -e "\033[31;49;1m`cat ${sub_die}`\033[31;49;0m\n"
    else
        echo -e "\033[44;36m所有虚拟机都存活.\033[0m\n"
    fi
}

case $1 in
    super)
        super_host
        ;;
    vm)
        sub_host
        ;;
    help)
        echo ""
        echo "`grep "功能" $file`"
        echo "super选项代表检测宿主机;"
        echo -e "vm选项代表检测虚拟机.\n"
        ;;
    *)
        echo ""
        echo -e $"Usage: sh $0 { super | vm | help }\n"
esac
exit 0

  

服务器配置文件格式:

renxiaowei$ cat server.txt
#功能:用于一键检测宿主机、虚拟机是否存活的文件
#格式:vm宿主机 ------ 宿主机管理端口 ---- 虚拟机 ---- 虚拟机管理端口

192.168.2.2           80            192.168.2.50     22
192.168.2.3           80            192.168.2.51     22

192.168.3.2           80            192.168.3.52     22

  请将脚本、服务器配置文件放在同一个目录下。

脚本执行方式:chmod + x check.sh && ./check.sh [super|vm|help] 或者 sh check.sh [super|vm|help] 。

脚本参数“super”意为宿主机检测;参数“vm”意为虚拟机检测。

原文地址:https://www.cnblogs.com/wellful/p/9569816.html

时间: 2024-07-31 00:39:02

小功能大用处 ---- 一键检测各服务器是否存活的相关文章

3.小功能大用处

标题 : 3.小功能大用处 目录 : Redis 序号 : 3 10) "students" 127.0.0.1:6379> ? ? ### GEOshell 添加地址位置信息 127.0.0.1:6379> geoadd cities:locations 116.28 39.55 beijing (integer) 1 添加已经存在的key,返回0 127.0.0.1:6379> geoadd cities:locations 116.28 39.55 beijin

【redis 学习系列08】Redis小功能大用处02 Pipeline、事务与Lua

3.Pipeline 3.1 Pipeline概念 Redis客户端执行一条命令分为如下四个过程: (1)发送命令 (2)命令排队 (3)命令执行 (4)返回结果 其中(1)和(4)称为Round Trip Time(RTT,往返时间). Redis提供了批量操作命令( 例如mget.mset等) ,可以有效地节约RTT.但大部分命令是不支持批量操作的,例如要执行n次hgetall命令,并没有mhgetall命令存在,需要消耗n次RTT.Redis的客户端和服务端可能部署在不同的机器上.例如客户

【redis 学习系列07】Redis小功能大用处01 慢查询分析以及Redis Shell

Redis提供了5种数据结构已经足够强大,但除此之外,Redis还提供了诸如慢查询分析.功能强大的Redis Shell.Pipeline.事务与Lua脚本.Bitmaps.HyperLogLog.发布订阅.GEO等附加功能,这些功能可以在某些场景发挥重要作用. 慢查询分析:通过慢查询分析,找出有问题的命令进行优化: Redis Shell:功能强大的Redis Shell会有意想不到的使用功能: Pipeline:通过Pipeline(管道或者流水线)机制有效提高客户端性能: 事务与Lua:制

移动端车牌识别,小功能大作用

手机拍照识别车牌技术是一款成熟的安卓手机拍照识别车牌,可以看到它支持的车牌类型很多,而且对摄像头像素要求不高,所以集成手机拍照识别车牌软件的时候方便了很多.车牌识别已经成为每个城市的车辆管理重点工作之一,有效.准确.及时的车牌识别为工作人员的交通执法.停车场车辆管理等工作带来极大的便利. 手机拍照识别车牌是指通过计算机视觉.图像处理与模式识别等方法从车辆图像中提取车牌字符信息,从而确定车辆身份的技术.手机拍照识别车牌分为车牌定位.字符分割.字符识别三大部分.车牌区域在整幅图像中所占比例很小,车牌

小扩展大用处,自己扩展一个ForeachRead吧

是否用过IList的扩展方法 Foreach,而郁闷IEnumerable没有这个扩展?(没用过??用用吧,真的很方便,可以少好几行呢!!) 是否为了有一个索引而不得不用 for 而不能用 foreach?? 那这个扩展方法适合你: public static void ForEachRead<T>(this IEnumerable<T> dx,Action<int,T> act) { int i = 0; foreach (var item in dx) { act(

web -- 小知识大用处

font-family: "Helvetica Neue",Helvetica,Arial,"Hiragino Sans GB","Hiragino Sans GB W3","Microsoft YaHei UI","Microsoft YaHei","WenQuanYi Micro Hei",sans-serif;CSS 去除手机点击时出现的灰色背景   #div: -webkit-t

Visual Studio Debugger中七个鲜为人知的小功能

Visual Studio debugger是一个很棒的调试工具,可以帮助程序猿们快速地发现和解决问题.这里给大家简单介绍一下VS调试工具中的七个鲜为人知的小功能. 1.    一键跳转到指定语句 调试过程中经常需要拖拽黄箭头,使特定语句执行或者不执行.常规方法就是使用鼠标直接拖拽. 在Visual Studio 2017 15.3预览版中,有一个更简单地跳转到目标行的方法:在目标行盘旋鼠标指针,出现绿色竖线右箭头图标后,按住CTRL后鼠标左键点击,就把调试黄箭头移过去了,再点击调试下一步或者F

由Trust Wallet理解以OA信用盘平台出售带杀大赔小功能太坊钱包管理和智能合约

钱包管理钱包管理就要提到OA信用盘平台出售带杀大赔小功能QQ2952777280 话仙论坛http://hxforum.com 一个类EtherKeystore, 应用的核心业务的处理类, 有钱包管理(创建.删除.导入.导出).助记词转化.签名工作.私钥管理等功能.EtherKeystore中使用了由Trust开源的了两个库: TrustKeystore: 用于管理钱包的通用以太坊密钥库.TrustCore: 区块链核心的数据结构和算法.还有CryptoSwift, 一个标准的安全加密算法集合的

小前端大能耐——Canvas与Javascript配合实现几个功能

1.粒子化 function Dot(X, Y, Z, R) { this.dx = X; this.dy = Y; this.dz = Z; this.tx = 0; this.ty = 0; this.tz = 0; this.z = Z; this.x = X; this.y = Y; this.r = R; this.paint = function() { context.save(); context.beginPath(); var scale = 250 / (250 + thi