有一些linux基础,最近刚开始学shell,参考了阿良老师的一个监测服务器硬盘状态的脚本,自己进行了一些扩展,今天比较晚了,后边会把注释放上来,感觉脚本还很不完善,希望大家一起探讨一下,共同学习

20180919: 进行了部分修改和优化

all_hosts.info 文件示例:

192.168.1.1 root 123456

192.168.1.2 root 123456

..

脚本正文:

#!/bin/sh

HOST_INFO=/opt/tools/all_hosts.info

TMP_FILE=/opt/tools/all_tmp.log

ALERT_FILE=/opt/tools/all_alert.log
echo null > $TMP_FILE ;#重置临时文件
for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO);#从IP、端口信息文件中读取相关的服务器IP,不是很理解'/^[^#]/'的意思,后边会对此进行补充
do
echo "开始测试服务器:$IP"
ping -c3 $IP 2>&1 >/dev/null;#ping三次
if [ $? -eq 0 ];#测试ping命令是否执行成功
then
echo -e "服务器:$IP 可以连通\n"
else
DATE=`date`
echo -e "注意!!!服务器:$IP 在时间:$DATE 未能连通\n" 2>&1 >>$ALERT_FILE;#执行不成功反馈结果到警告文件
fi
USER=$(awk -v ip=$IP 'ip==$1{print $2}' $HOST_INFO);#awk -v 取shell中的变量IP,读取登录所用的用户
PORT=$(awk -v ip=$IP 'ip==$1{print $3}' $HOST_INFO);#读取ssh端口
echo "-------开始检测测盘占用,详情见文件:all_tmp.log,和报警文件:all_alert.log---------"
echo '------------------------------------------------------------------------------------' >> $TMP_FILE
ssh -p $PORT $USER@$IP 'df -hP' > $TMP_FILE;#读取服务器的磁盘信息,此处存在一个设计漏洞,一旦目标服务器不通或者df卡死,则此处脚本卡死无法继续
if [ $? -gt 0 ];#判断ssh执行是否成功
then
echo -e "`date`请检查服务器:$IP ssh连接\n" 2>&1 >>$ALERT_FILE
fi
USE_RATE_LIST=$( awk 'BEGIN{OFS="="}/^\/dev/{print $1,int($5)}' $TMP_FILE);#建立数组,OFS的用法见附录①,形成/dev/sda=10 这样格式的数组
for USE_RATE in $USE_RATE_LIST
do
PART_NAME=${USE_RATE%=*};#读取数组内容 /dev/sda=10 读取到/dev/sda
USE_RATE=${USE_RATE#*=};#读取数组内容 /dev/sda=10 读取到10
if [ $USE_RATE -ge 80 ];#判断读取到的磁盘利用率是否大于等于80
then
echo -e "警告:服务器:$IP 磁盘:$PART_NAME 使用率: $USE_RATE"
echo -e "警告(`date`):服务器:$IP 磁盘:$PART_NAME 使用率: $USE_RATE" 2>&1 >> $ALERT_FILE
fi
done
done
rm -f $TMP_FILE

附录:

①:awk RS ORS FS OFS 的用法:

https://www.cnblogs.com/fhefh/archive/2011/11/16/2251656.html

附 :

阿良老师脚本(测试版,改动了文件路径等):

#!/bin/bash
HOST_INFO=/opt/tools/stat_host.info
TMP_FILE=/opt/tools/tmp_stat_disk.log
date > $TMP_FILE
echo '------------------------------------------------------------------------------------' >> $TMP_FILE
for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); do
USER=$(awk -v ip=$IP 'ip==$1{print $2}' $HOST_INFO)
PORT=$(awk -v ip=$IP 'ip==$1{print $3}' $HOST_INFO)
echo '------------------------------------------------------------------------------------' >> $TMP_FILE
echo $IP >> $TMP_FILE
ssh -p $PORT $USER@$IP 'df -h -P' >> $TMP_FILE
USE_RATE_LIST=$( awk 'BEGIN{OFS="="}/^\/dev/{print $1,int($5)}' $TMP_FILE)
for USE_RATE in $USE_RATE_LIST; do
PART_NAME=${USE_RATE%=*}
USE_RATE=${USE_RATE#*=}
if [ $USE_RATE -ge 80 ]; then
echo "Warning: $PART_NAME Partition usage $USE_RATE%!" 
fi
done
done
more $TMP_FILE

更新日志:

20180920:(待解决)ssh或者df命令执行不成功整个脚本卡死问题

linux批量检测服务器能否ping通和硬盘容量状态并抛出报警的一个脚本-附详细解释的更多相关文章

  1. python检测服务器是否ping通

    好想在2014结束前再赶出个10篇博文来,~(>_<)~,不写博客真不是一个好兆头,至少说明对学习的欲望和对知识的研究都不是那么积极了,如果说这1天的时间我能赶出几篇精致的博文,你们信不信 ...

  2. Linux利用nc命令脚本批量检测服务器指定端口是否开放

    一.nc命令检测端口的用法 # nc -v -w 10 %IP% -z %PORT% -v 显示指令执行过程. -w <超时秒数> 设置等待连线的时间. -u 表示使用UDP协议 -z 使 ...

  3. 解决redhat linux下IP地址可以ping通,域名无法ping通问题

    解决redhat linux下IP地址可以ping通,域名无法ping通 在/etc/resolv.conf中添点东西 格式如下: nameserver xxx.xxx.xxx.xxx nameser ...

  4. Python批量检测服务器端口可用性与Socket函数使用

    socket函数 简述 socket又称套间字或者插口,是网络通信中必不可少的工具.有道是:"无socket,不网络".由于socket最早在BSD Unix上使用,而Unix/L ...

  5. win server 2012 服务器不能ping通

    以windows server 2012作为服务器,服务器能够ping通局域网中的客户端A,但A不能ping通服务器. 解决办法: 确定服务器中系统->远程设置->远程桌面选项下为允许选项 ...

  6. 为虚机Linux系统设置静态IP,ping通外网并解决相关问题

    在虚机中安装完Linux系统后,虚机是ping不通外网的,而默认的动态IP会为之后的Hadoop应用造成不少麻烦,为了减少这些不必要的麻烦,我们把系统的IP设置为静态. 步骤: 修改系统配置文件 命令 ...

  7. 批量检测服务器是否能telnet连通

    # coding: UTF-8import osimport sysimport jsonimport platformfrom _utils.patrol2 import data_format,r ...

  8. 本地服务器能ping通,但是ssh及各种端口都访问不到---待整理

    情况描述: 情况一:后来发现,开机需要很长一段时间之后才能正常的访问那台机器 原因:系统启动时加载的程序多,所以开机需要很长的时间,关掉不用的就可以了 情况二:服务器位于局域网内,有的时候可以访问到, ...

  9. 服务器能ping通ip,通不了域名解决方案

    # 将网卡配置文件配置固定ip后,添加DNS解析,然后重启网卡即可: [root@a ~]# tail -2 /etc/sysconfig/network-scripts/ifcfg-ens160 D ...

随机推荐

  1. python __builtins__ tuple类 (68)

    68.'tuple', 转换为元组类型 class tuple(object) | tuple() -> empty tuple | tuple(iterable) -> tuple in ...

  2. P5165 xtq的棋盘

    传送门 设\(f[i]\)为\(i\)位置向左走一步的期望时间,那么答案就是\(\sum_{i=1}^mf[i]\) 首先\(f[n]=1\),设\(p\)为向左的概率,对于\(i<n\)的位置 ...

  3. NOIP2017 赛后总结

    NOIP2017 确实,一场很深刻的考试结束了. 现在也已经搞了两周的学科了,在补之前两个月的学科的内容. 距离11.12已经过去12天了. 姓名 准考证号 math complexity park ...

  4. div里面放img

    div里面放img的时候 会出现包裹不住的情况,这个时候 只要将img { width:100%,height:100%  },就可以解决问题了

  5. ssh公私密钥的生成

    ssh密钥的生成 root账号密钥的生成: 这里我们切换到root账号下,执行ssh-keygen命令: ssh-keygen -t dsa 然后一路回车即可 """ [ ...

  6. 记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty

    题目传送门 /* 题意:给了两堆牌,每次从首部取出一张牌,按颜色分配到两个新堆,分配过程两新堆的总数差不大于1 记忆化搜索(DFS+DP):我们思考如果我们将连续的两个操作看成一个集体操作,那么这个操 ...

  7. 把AM_B_ENTRY表里的ARCHIVAL_CODE字段,值复制给BA_ARCHIVAL_CODE_160812字段

    UPDATE AM_B_ENTRY T SET T.BA_ARCHIVAL_CODE_160812=T.ARCHIVAL_CODE SELECT BA_ARCHIVAL_CODE_160812 FRO ...

  8. POM报错Failure to transfer org.apache.maven.plugins:maven-resources-plugin:pom:2.6 from

    解决方式一:   1.查看.m2\repository\org\apache\maven\plugins\maven-resources-plugin\下maven-resources-plugin- ...

  9. 491 Increasing Subsequences 递增子序列

    给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2.示例:输入: [4, 6, 7, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, ...

  10. C#中分部类和分部方法的应用

    本篇文章介绍了,C#中分部类和分部方法的应用.需要的朋友参考下     分部类(Partial Class)在C#2.0引入,分部方法(Partial Method)在C#3.0引入,这两个语法特性都 ...