文档章节

一个比较全面的SHELL监控脚本

五大三粗
 五大三粗
发布于 2015/04/25 12:12
字数 1791
阅读 46
收藏 0
#! /bin/sh
#################################################
#         主机健康状态监控脚本
#   (监控内容:内存、CPU、磁盘、网卡)
#
#    V1.0      Writen by: MR.G       Date:2012-03-20
##################################################


export LANG=C




#设定管理员的信箱
Email=zhangxiaogang@8tgame.com


#设定日期格式
time=`date "+%Y-%m-%d %H:%M:%S"`


#设定日志文件
log=`date +%Y-%m-%d`.log


#设定配置文件的路径
config=config.ini


if [[ -f $config && -s $config ]];then


        for ip in `cat $config`
                do
# -------------------------------------------------------------------------------------------------
# 检查服务器的状态,如果异常,则发送mail报警。
# -------------------------------------------------------------------------------------------------
        ssh $ip pwd &> /dev/null
        if [ $? -ne 0 ];then
                #echo "主机:$ip的SSH无法登陆,请及时处理!" | mail -s "$ip SSH状态异常" $Email
                 echo "$time $ip 的SSH状态检查完毕,状态:Failed.">>$log                
        else
                 echo "$time $ip 的SSH状态检查完毕,状态:Ok."   >>$log


# -------------------------------------------------------------------------------------------------
# 更新服务器的时间
# ----------------------------------------------------------
#设定NTP Server
server="ntp.fudan.edu.cn"


ssh $ip /usr/sbin/ntpdate -s $server
ssh $ip /usr/sbin/hwclock --systohc 
# -------------------------------------------------------------------------------------------------
# 检查服务器网络状态,如果无法ping通,则发送mail报警。(ICMP过滤的除外)
# -------------------------------------------------------------------------------------------------
#设定检测的网站
site=www.baidu.com


ssh $ip ping -c3 www.baidu.com >/dev/null
if [  $? -ne 0 ]; then


                   #echo "主机:$ip无法ping通,请及时处理!" | mail -s "$ip 磁盘空间警告" $Email
                        echo "$time $ip 的网络状态检查完毕,状态:Failed.">>$log
                else
                        echo "$time $ip 的网络状态检查完毕,状态:Ok."        >>$log
fi




# -------------------------------------------------------------------------------------------------
# 检查系统的磁盘空间,如果使用率超过90%,则发送mail报警。
# -------------------------------------------------------------------------------------------------


#设定的阀值
space_warn="90"


ssh $ip df -P | grep "^/dev"| awk '{print $0}' | while read x
        do
                space_name=`echo $x | awk '{print $1}'`
                space_per=`echo $x | awk '{print $5}' | sed 's/%//g'`
                space_used=`echo $x | awk '{print $3}'`
                if [ $space_per -ge $space_warn ];then
                                #echo "主机:$ip的$space_name分区仅剩下$space_used M,使用率为$space_per,已超过指定阀值,请及时处理!" | mail -s "$ip 磁盘空间警告" $Email
                                echo -e "$time $ip 的$space_name分区检查完毕,状态:Failed.">>$log
                        else
                                echo -e "$time $ip 的$space_name分区检查完毕,状态:Ok."        >>$log                
                fi
        done




# -------------------------------------------------------------------------------------------------
# 检查系统的内存状态,如果交换分区的使用率超过80%,则发送mail报警。
# -------------------------------------------------------------------------------------------------


#设定的阀值
swap_warn=80


swap_total=`ssh $ip free -m | grep "Swap" | awk '{print $4}'` 
swap_free=`ssh $ip free -m | grep "Swap" | awk '{print $2}' `
swap_used=`ssh $ip free -m | grep "Swap" | awk '{print $3}' `


if [ $swap_used -ne 0 ];then
        swap_per=$[[$swap_used / $swap_total]*100]
        if [ $swap_per -ge $swap_warn ];then
                        #echo "主机:$ip的Swap交换分区仅剩下$swap_free M,使用率为$swap_per,已超过指定阀值,请及时处理!" | mail -s "$ip 内存使用警告" $Email
                        echo "$time $ip的Swap分区检查完毕,状态:Failed." >> $log
                else
                        echo "$time $ip的Swap分区检查完毕,状态:Ok." >> $log
                fi
fi        


# -------------------------------------------------------------------------------------------------
# 检查系统CPU的状态,如果使用率超过80%,则发送mail报警
# -------------------------------------------------------------------------------------------------


#设定的阀值
cpu_warn=80


cpu_free=`ssh $ip top -b -n 1 | grep "Cpu" | awk '{print $5}' | sed 's/%id,//g'`
cpu_used=$(echo "100 - $cpu_free" | bc)


if [ `echo "$cpu_used >= $cpu_warn" | bc ` -eq 1 ];then
                #echo "主机:$ip的CPU使用率为$cpu_used%,已超过指定阀值,请及时处理!" | mail -s "$ip CPU使用警告" $Email
                echo "$time $ip 的CPU状态检查完毕,状态:Failed." >> $log
        else
                echo "$time $ip 的CPU状态检查完毕,状态:Ok." >> $log        
fi


# -------------------------------------------------------------------------------------------------
# 检查系统登陆的用户数,如果当前用户数超过3个,则发送mail报警
# -------------------------------------------------------------------------------------------------


#设定的阀值
users_max=4


users_now=`ssh $ip uptime | awk '{print $4}'`


if [ $user_now >=$users_max ];then
                #echo "$ip登陆的用户数已经达到了$user_nowg个,已超过指定的阀值,请及时处理!" | mail -s "$ip 用户数报警" $Email
                echo "$time $ip的用户数检查完毕,状态:Failed." >> $log
        else
                echo "$time $ip 的用户数检查完毕,状态:Ok." >> $log        
fi


# -------------------------------------------------------------------------------------------------
# 检查系统十五分钟内的平均负载情况,如果超过0.7(单核),则发送mail报警
# -------------------------------------------------------------------------------------------------


#设定的阀值
load_warn=0.7


cpu_num=`ssh $ip cat /proc/cpuinfo | grep -c "model name"`


load_num=`ssh $ip uptime | awk '{print $10}'`


load_average=`echo "scale=2;$load_num/$cpu_num" | bc`


if [ `echo "$load_average >= $load_warn" | bc` -eq 1 ];then
                #echo "$ip 15分钟单核的平均负载已经达到$load_average,已超过指定的阀值,请及时处理!" | mail -s "$ip 平均负载报警" $Email
                echo "$time $ip 的平均负载检查完毕,状态:Failed." >> $log
        else
                echo "$time $ip 的平均负载检查完毕,状态:Ok." >> $log        
fi




# -------------------------------------------------------------------------------------------------
# 检查系统当前的IP连接数,如果超过8000,则发送mail报警
# -------------------------------------------------------------------------------------------------


#设定的阀值
conns_warn=8000


ip_conns=`ssh $ip netstat -an | grep tcp | grep EST | wc -l`


if [ $ip_conns -ge $conns_warn ];then
        #echo "$ip 的IP连接数已经达到$ip_conns,已超过指定的阀值,请及时处理!" | mail -s "$ip IP连接数" $Email
                echo "$time $ip 的IP连接数检查完毕,状态:Failed." >> $log
        else
                echo "$time $ip 的IP连接数检查完毕,状态:Ok." >> $log        
        
fi




# -------------------------------------------------------------------------------------------------
# 检查系统Apache服务的运行状态,如果不返回200,则发送mail报警
# -------------------------------------------------------------------------------------------------


httpd=`ssh $ip ps -ef  |grep httpd |awk '{if($3==1)print $0}'|awk '{if($1=="root")print $3 }'`


if [ "$httpd" != "1" ];then
        echo "$time $ip Apache状态异常,尝试重启进程……" >> $log
        ssh $ip /etc/init.d/httpd restart &> /dev/null
        ssh $ip sleep 100
        httpd=`ssh $ip ps -ef  |grep httpd |awk '{if($3==1)print $0}'|awk '{if($1=="root")print $3 }'`
        if [ "$httpd" != "1" ];then
                result=`wget -o /dev/stdout "http://$ip/" | grep "HTTP"| awk '{print $6}'`
                if [ "$result" != "200" ];then
                         #echo "主机:$ip 的Apache服务已经没有响应,请及时处理!" | mail -s "$ip Apache服务警告" $Email
                         echo "$time $ip 的Apache状态检查完毕,状态:Failed." >> $log
                else
                        echo "$time $ip 的Apache状态检查完毕,状态:Ok." >> $log
                
                fi
        else
                   #echo "主机:$ip 的Apache服务已经没有响应,请及时处理!" | mail -s "$ip Apache服务警告" $Email
                echo "$time $ip 的Apache状态检查完毕,状态:Failed." >> $log                        
        fi
else
        result=`wget -o /dev/stdout "http://$ip/" | grep "HTTP" | awk '{print $6}'`
                if [ "$result" != "200" ];then
                         #echo "主机:$ip 的Apache服务已经没有响应,请及时处理!" | mail -s "$ip Apache服务警告" $Email
                         echo "$time $ip 的Apache状态检查完毕,状态:Failed." >> $log
                else
                        echo "$time $ip 的Apache状态检查完毕,状态:Ok." >> $log


                fi
fi






# -------------------------------------------------------------------------------------------------
# 检查系统MySQL服务的运行状态,通过检查端口3360,若重启后不正常发送mail报警(没有考虑锁表的情况)
# -------------------------------------------------------------------------------------------------




PORT=`ssh $ip netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{print $5}'`




if [ $PORT -eq 3306 ];then
        echo "$time $ip 的MySQL状态检查完毕,状态:Ok." >> $log
else
        echo "$time $ip MySQL状态异常,尝试重启进程……" >> $log
        ssh $ip /etc/init.d/mysqld restart &>/dev/null
        PORT=`ssh $ip netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{print $5}'`
        if [ $PORT -eq 3306 ];then
                        echo "$time $ip 的MySQL状态检查完毕,状态:Ok." >> $log
       else
                        #echo "主机:$ip 的MySQL服务已经没有响应,请及时处理!" | mail -s "$ip MySQL服务警告" $Email
                 echo "$time $ip 的MySQL状态检查完毕,状态:Failed." >> $log
       fi
fi






# -------------------------------------------------------------------------------------------------
# 检查系统网卡的流速情况,如果超过指定的阀值,则发送mail报警
# -------------------------------------------------------------------------------------------------


#设定的阀值,单位KB/S
speed_warn=10240


send_before=`ifconfig eth0 | grep bytes | awk '{print $6}' | awk -F : '{print $2}'`
recv_before=`ifconfig eth0 | grep bytes | awk '{print $2}' | awk -F : '{print $2}'`


sleep 1


send_after=`ifconfig eth0 | grep bytes | awk '{print $6}' | awk -F : '{print $2}'`
recv_after=`ifconfig eth0 | grep bytes | awk '{print $2}' | awk -F : '{print $2}'`


send_bytes=`expr $send_after - $send_before`
recv_bytes=`expr $recv_after - $recv_before`


send_speed=`expr $send_bytes / 1024`
recv_speed=`expr $recv_bytes / 1024`


if [[ `echo "$send_speed >= $speed_warn" | bc` -eq 1  || `echo "$recv_speed >= $speed_warn" | bc` -eq 1 ]];then
                # echo "$ip 的网卡流速为$send_speed Kb/s(上行)/$recv_speed Kb/s(下行),已超过指定的阀值,请及时处理!" | mail -s "$ip 平均负载报警" $Email
                echo "$time $ip 的网卡流速检查完毕,状态:Failed." >> $log
        else
                echo "$time $ip 的网卡流速检查完毕,状态:Ok." >> $log        
fi




fi        
                done
else
        echo  "配置文件不存在或内容为空,请检查!"


fi

© 著作权归作者所有

五大三粗
粉丝 163
博文 2291
码字总数 4764188
作品 0
广州
程序员
私信 提问
shell与python判断文件是否存在

  日常运维中,我们会存在每日备份的现象,针对这一种情况可能会要求监控文件是否存在。比较笨拙的方法就是登录上服务器到某个路径下查看文件是否存在,除此之外,我们可以利用shell或者p...

南部小城y
2018/08/06
0
0
用shell脚本监控进程是否存在 不存在则启动的实例

用shell脚本监控进程是否存在 不存在则启动的实例 用shell脚本监控进程是否存在 不存在则启动的实例,先上代码干货: #!/bin/shps -fe|grep processString |grep -v grepif [ $? -ne 0 ]the...

xiaozhenkai
2017/07/31
0
0
Shell编程(shell中的函数、shell中的数组、 告警系统需求分析)

shell中的函数 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可。 语法: ps : function(该关键词可省略,直接写函数名称...

蛋黄_Yolks
2018/09/18
0
0
Shell脚本编程与文件系统修复

Linux 基金会认证程序。 Video Player 本讲集中讲解简单的 Shell 脚本编程和文件系统修复。这两块内容都是 LFCS 认证中的必备考点。 理解终端 (Terminals)和 Shell 首先要声明一些概念。 ...

linuxprobe
2016/07/20
6
0
70.shell的函数 数组 告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.16/20.17 shell中的函数: ~1. 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段...

王鑫linux
2018/09/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式场景下如何保证消息队列实现最终一致性

考虑一个分布式场景中一个常见的场景:服务A执行某个数据库操作成功后,会发送一条消息到消息队列,现在希望只有数据库操作执行成功才发送这条消息。下面是一些常见的作法: 1. 先执行数据库...

中关村的老男孩
19分钟前
1
0
招银网络面试题、考点、知识点总结(Java岗)

java基础 全是基础不用多说肯定考的多,尤其是招银 OOP特性/java语言特性:封装、继承、多态 多态具体的表现:多态应用举例、如何调用父类方法(super)、重写和重载(重写父类方法的规则、构...

戎码益深
24分钟前
0
0
Mybatis深入源码分析之SQLSession一级缓存原理分析

源码分析图

须臾之余
28分钟前
0
0
成年人社交中的10个潜规则

前阵子我建议大家有空的时候,一定要去看《红楼梦》这本书。 原因就是从这本书,可以学习到很多很多人情世故,人情世故在学校里,老师几乎都不会教,所以我们只能靠自己去学。 只有自己去学了...

ZhangLG
30分钟前
1
0
在PyCharm中使用Pylint

简介 pylint是一个用于检查python代码中的错误,尝试强制执行编码标准的工具。它还可以查找某些类型错误,可以建议如何重构特定块的建议,并可以向您提供有关代码复杂性的详细信息。 官网:w...

哼_哼
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部