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

检测服务器是否存活的原理很简单:先检查服务器是否通(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 ];thenecho "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.txtping -c2 -i0.02 $host > /dev/null 2>&1
if [ $? -eq 0 ];thenecho "$host can access ...."
else(sleep 1;) | telnet $host $port > $telnet_filegrep -B 1 \] $telnet_file > /dev/null 2>&1if [ $? -eq 0 ];thenecho "$host can access ..."elseecho "$host can not access !!!"    fi
fi

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

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

执行脚本:

renxiaowei$ cat check.sh#!/bin/bash
# 功能:一键检测宿主机、虚拟机是否存活
# 作者:任小为
# 版本:v1.0file=server.txt
result_base=/tmp/check_host_netrm -rf $result_base
mkdir -p $result_basesuper_host(){super_ip_list=${result_base}/super_ip_list.txtsuper_alive=${result_base}/super_alive.txtsuper_die=${result_base}/super_die.txtsuper_telnet=${result_base}/super_telnet.txtecho ""echo -e "\033[44;36m检测宿主机是否存活... \033[0m"egrep -v "#|^$" $file | awk '{print $1,$2}' | uniq > $super_ip_listcount=0for ip in $(cat ${super_ip_list} | awk '{print $1}');dolet count++echo "count=$count"ping -c 2 -i 0.02 $ip > /dev/null 2>&1if [ $? -eq 0 ];thenecho $ip >> ${super_alive}elsesuper_port=`grep $ip ${super_ip_list} | awk '{print $2}'`(sleep 1;) | telnet $ip ${super_port} >> ${super_telnet}fidoneif [ -e ${super_telnet} ];thensuper_ip=${result_base}/super_ip.txtcat ${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}fiecho ""echo -e "\033[32;49;1m存活的宿主机: \033[31;49;0m"echo -e "`cat ${super_alive}`\n"if [ -s ${super_die} ];thenecho -e "\033[31;49;1m检测不通的宿主机:\033[31;49;0m"echo -e "\033[31;49;1m`cat ${super_die}`\033[31;49;0m\n"elseecho -e "\033[44;36m所有宿主机都存活.\033[0m\n"fi
}sub_host(){sub_ip_list=${result_base}/sub_ip_list.txtsub_alive=${result_base}/sub_alive.txtsub_die=${result_base}/sub_die.txtsub_telnet=${result_base}/sub_telnet.txtecho ""echo -e "\033[44;36m检测虚拟机是否存活... \033[0m"egrep -v "#|^$" $file | awk '{print $3,$4}' | uniq > $sub_ip_listsub_count=0for sub_ip in $(cat ${sub_ip_list} | awk '{print $1}');dolet sub_count++echo "count=${sub_count}"ping -c 2 -i 0.02 ${sub_ip} > /dev/null 2>&1if [ $? -eq 0 ];thenecho ${sub_ip} >> ${sub_alive}elsesub_port=`grep ${sub_ip} ${sub_ip_list} | awk '{print $2}'`(sleep 1;) | telnet ${sub_ip} ${sub_port} >> ${sub_telnet}fidoneif [ -e ${sub_telnet} ];thensub_ip=${result_base}/sub_ip.txtcat ${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}fiecho ""echo -e "\033[32;49;1m存活的虚拟机: \033[31;49;0m"echo -e "`cat ${sub_alive}`\n"if [ -s ${sub_die} ];thenecho -e "\033[31;49;1m检测不通的虚拟机:\033[31;49;0m"echo -e "\033[31;49;1m`cat ${sub_die}`\033[31;49;0m\n"elseecho -e "\033[44;36m所有虚拟机都存活.\033[0m\n"fi
}case $1 insuper)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     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”意为虚拟机检测。

转载于:https://www.cnblogs.com/wellful/p/9569816.html

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

  1. 生成msk文件的用处_Yotta企业云盘“小”功能大用处企业办公好伙伴

    Yotta企业云盘"小"功能大用处企业办公好伙伴 对于传统的数据存储,Yotta企业云盘可以很好的超越传统存储所面临的挑战. 1.支持本地文件多个同时上传:在网盘中,在需要上传文件 ...

  2. redis 小功能大用处

    慢查询日志分析 redis提供了慢查询日志功能,会计算每条命令的执行时间,超过阈值后记录下来,注意计算的是命令的执行时间,不包含网络传输和排队时间. config get slowlog-log-sl ...

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

    3.Pipeline 3.1 Pipeline概念 Redis客户端执行一条命令分为如下四个过程: (1)发送命令 (2)命令排队 (3)命令执行 (4)返回结果 其中(1)和(4)称为Round T ...

  4. vivo手机怎么投屏到电脑_小功能大用处!vivo手机的智慧投屏,轻松实现“跨屏显示”...

    随着网络科技的发展,手机在生活中起着越来越重要的作用,不仅能够看视频玩游戏,甚至还能实现轻办公.由于目前处于特殊时期,不少企业和学校不得不延长假期,纷纷开展远程办公.远程学习的模式.虽然手机能完成很多 ...

  5. Redis 发布订阅,小功能大用处,真没那么废材!

    假设我们有这么一个业务场景,在网站下单支付以后,需要通知库存服务进行发货处理. 上面业务实现不难,我们只要让库存服务提供给相关的给口,下单支付之后只要调用库存服务即可. 后面如果又有新的业务,比如说积 ...

  6. redis小功能大用处-bitmaps

    转载于:https://www.cnblogs.com/gogogofh/p/11288414.html

  7. 大华事件检测智能服务器,大华股份:高速公路智能事件检测 解决方案

    1方案背景 随着我国基础设施建设的飞速发展,公路尤其是高速公路的总里程数年年攀升.交通运输部统计数据显示,截止2017年底全国公路总里程477.35万公里,其中高速公路13.65万公里,位居世界第一. ...

  8. 小设计大用处 笔记本接口知识

    出于便携的考虑,通常笔记本都是采取外部扩展的方式来增加功能和用途,所以丰富的外部扩展接口/端口显得尤为重要.不过还是有许多朋友在购买笔记本的时候对产品接口的认识不是很多,常常被经销商的介绍弄得一头雾水 ...

  9. 动画程序时长缩放是什么意思_1分钟做出高逼格动画!PPT中自带的小功能帮你一键搞定!...

    文末有个大福利!文末有个大福利! 这个功能就是缩放. 算是新版本PPT软件中的一个功能,其实已经推出很久了,网上也有一些文章介绍过它. 但我估计,仍旧有很多朋友对它很陌生,所以这一篇文章,请允许我重新 ...

  10. 小技巧大用处!这些渠道让你的群发邮件更省心

    群发电子邮件,也称为电子直邮(EDM),是一种强大的营销工具,使企业能够一口气接触到大量客户.然而,为了使这一战略有效地发挥作用,了解使用正确的渠道是很重要的.在本文中,我们将探索群发邮件有哪些渠道? ...

最新文章

  1. c++ stl之pirority_queue
  2. 深入理解Android中View
  3. 化工原理 蒸馏(下)
  4. 两个listmap合并去重_Excel 二维表,相同行标题的多个值各占一行,如何合并为一行?...
  5. atom对比 vscode_VS Code、ATOM这些开源文本编辑器的代码实现中有哪些奇技淫巧?...
  6. coco showanns不显示_coco奶茶加盟好不好?【5月官网最新公布】加盟费用+加盟流程...
  7. postman自动打开_编写自动执行postman的脚本
  8. 关于SOA您该知道却不愿知道的十件事
  9. 用.net实现按透明度生成水印文件
  10. MDC介绍 -- 一种多线程下日志管理实践方式
  11. 买电梯房几楼才是最好 几个最差楼层千万不能选
  12. 开源容灾备份工具介绍
  13. Ubuntu 16.04 安装opencv3及其扩展模块
  14. 免费天气API,天气JSON API,天气插件
  15. 12.14黄金白银实时行情分析,黄金原油解套操作策略
  16. 重磅!这可能是史上最全的AI产业链地图了
  17. cad2017单段线_CAD中如何绘制多段线
  18. 10大主流压力测试工具
  19. 【冬瓜哥画PPT】最完整的存储系统接口/协议/连接方式总结
  20. 网易云音乐面向用户增长的数据治理实践

热门文章

  1. OpenCV3.0.0 + VS2012 的环境搭建
  2. C程序设计案例(牛顿迭代法求高次方程的根)
  3. linux异步事件框架,基于Cortex-M系列CPU的异步事件驱动中间件
  4. cors java 安全问题_使用CORS实现JavaWeb跨域请求问题的方法
  5. nyoj 643intersection set
  6. POJ 2406题解kmp算法的应用
  7. 手机微商城可以安装到虚拟服务器,安装使用:百家CMS微商城系统安装教程(图文说明)...
  8. mysql游标使用 loop_mysql 游标 loop while 的使用
  9. 机器学习 Machine Learning- 吴恩达Andrew Ng 第11~15课总结
  10. linux命令行中的大括号,linux命令行学习(19):花括号扩展(brace expansion)