一键检测各服务器是否存活

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

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

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

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

?

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

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

?

1echo $?

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

?

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

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

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

?

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

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

?

#!/bin/bash# test.host= www.baidu.comport=80telnet_file=/tmp/telnet_file.txtping -c2 -i0.02 $host > /dev/null 2>&1if [ $? -eq 0 ];then    echo "$host can access ...."else    (sleep1;) | telnet $host $port > $telnet_file    grep -B 1 \] $telnet_file > /dev/null2>&1    if [ $? -eq 0 ];then        echo "$host can access ..."    else        echo "$host can not access !!!"
 fifi

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

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

执行脚本:

?

 renxiaowei$ cat check.sh#!/bin/bash# 功能:一键检测宿主机、虚拟机是否存活# 作者:任小为# 版本:v1.0file=server.txtresult_base=/tmp/check_host_netrm -rf $result_basemkdir -p $result_basesuper_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 $1in    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"esacexit 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     22192.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”意为虚拟机检测。

作者:MMMHUHU

链接:http://www.imooc.com/article/73665

来源:慕课网

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容