Linux服务器硬件运行状态及故障邮件提醒的监控脚本分享

监控硬件运行状况

shell 监控cpu,memory,load average,记录到log,当负载压力时,发电邮通知管理员。
原理:
1.获取cpu,memory,load average的数值
2.判断数值是否超过自定义的范围,例如(CPU>90%,Memory<10%,load average>2)
3.如数值超过范围,发送电邮通知管理员。发送有时间间隔,每小时只会发送一次。
4.将数值写入log。
5.设置crontab 每30秒运行一次。

ServerMonitor.sh

#!/bin/bash 

# 系统监控,记录cpu、memory、load average,当超过规定数值时发电邮通知管理员 

# *** config start *** 

# 当前目录路径
ROOT=$(cd "$(dirname "$0")"; pwd) 

# 当前服务器名
HOST=$(hostname) 

# log 文件路径
CPU_LOG="${ROOT}/logs/cpu.log"
MEM_LOG="${ROOT}/logs/mem.log"
LOAD_LOG="${ROOT}/logs/load.log" 

# 通知电邮列表
NOTICE_EMAIL='admin@admin.com' 

# cpu,memory,load average 记录上一次发送通知电邮时间
CPU_REMARK='/tmp/servermonitor_cpu.remark'
MEM_REMARK='/tmp/servermonitor_mem.remark'
LOAD_REMARK='/tmp/servermonitor_loadaverage.remark' 

# 发通知电邮间隔时间
REMARK_EXPIRE=3600
NOW=$(date +%s) 

# *** config end *** 

# *** function start *** 

# 获取CPU占用
function GetCpu() {
  cpufree=$(vmstat 1 5 |sed -n '3,$p' |awk '{x = x + $15} END {print x/5}' |awk -F. '{print $1}')
  cpuused=$((100 - $cpufree))
  echo $cpuused 

  local remark
  remark=$(GetRemark ${CPU_REMARK}) 

  # 检查CPU占用是否超过90%
  if [ "$remark" = "" ] && [ "$cpuused" -gt 90 ]; then
    echo "Subject: ${HOST} CPU uses more than 90% $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}
    echo "$(date +%s)" > "$CPU_REMARK"
  fi
} 

# 获取内存使用情况
function GetMem() {
  mem=$(free -m | sed -n '3,3p')
  used=$(echo $mem | awk -F ' ' '{print $3}')
  free=$(echo $mem | awk -F ' ' '{print $4}')
  total=$(($used + $free))
  limit=$(($total/10))
  echo "${total} ${used} ${free}" 

  local remark
  remark=$(GetRemark ${MEM_REMARK}) 

  # 检查内存占用是否超过90%
  if [ "$remark" = "" ] && [ "$limit" -gt "$free" ]; then
    echo "Subject: ${HOST} Memory uses more than 90% $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}
    echo "$(date +%s)" > "$MEM_REMARK"
  fi
} 

# 获取load average
function GetLoad() {
  load=$(uptime | awk -F 'load average: ' '{print $2}')
  m1=$(echo $load | awk -F ', ' '{print $1}')
  m5=$(echo $load | awk -F ', ' '{print $2}')
  m15=$(echo $load | awk -F ', ' '{print $3}')
  echo "${m1} ${m5} ${m15}" 

  m1u=$(echo $m1 | awk -F '.' '{print $1}') 

  local remark
  remark=$(GetRemark ${LOAD_REMARK}) 

  # 检查是否负载是否有压力
  if [ "$remark" = "" ] && [ "$m1u" -gt "2" ]; then
    echo "Subject: ${HOST} Load Average more than 2 $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}
    echo "$(date +%s)" > "$LOAD_REMARK"
  fi
} 

# 获取上一次发送电邮时间
function GetRemark() {
  local remark 

  if [ -f "$1" ] && [ -s "$1" ]; then
    remark=$(cat $1) 

    if [ $(( $NOW - $remark )) -gt "$REMARK_EXPIRE" ]; then
      rm -f $1
      remark=""
    fi
  else
    remark=""
  fi 

  echo $remark
} 

# *** function end *** 

cpuinfo=$(GetCpu)
meminfo=$(GetMem)
loadinfo=$(GetLoad) 

echo "cpu: ${cpuinfo}" >> "${CPU_LOG}"
echo "mem: ${meminfo}" >> "${MEM_LOG}"
echo "load: ${loadinfo}" >> "${LOAD_LOG}" 

exit 0

监控网站是否异常
shell 监控网站是否异常的脚本,如有异常自动发电邮通知管理员。
流程:
1.检查网站返回的http_code是否等于200,如不是200视为异常。
2.检查网站的访问时间,超过MAXLOADTIME(10秒)视为异常。
3.发送通知电邮后,在/tmp/monitor_load.remark记录发送时间,在一小时内不重复发送,如一小时后则清空/tmp/monitor_load.remark。

#!/bin/bash 

SITES=("http://web01.example.com" "http://web02.example.com") # 要监控的网站
NOTICE_EMAIL='me@example.com'                 # 管理员电邮
MAXLOADTIME=10                        # 访问超时时间设置
REMARKFILE='/tmp/monitor_load.remark'             # 记录时否发送过通知电邮,如发送过则一小时内不再发送
ISSEND=0                           # 是否有发送电邮
EXPIRE=3600                          # 每次发送电邮的间隔秒数
NOW=$(date +%s) 

if [ -f "$REMARKFILE" ] && [ -s "$REMARKFILE" ]; then
  REMARK=$(cat $REMARKFILE) 

  # 删除过期的电邮发送时间记录文件
  if [ $(( $NOW - $REMARK )) -gt "$EXPIRE" ]; then
    rm -f ${REMARKFILE}
    REMARK=""
  fi
else
  REMARK=""
fi 

# 循环判断每个site
for site in ${SITES[*]}; do 

  printf "start to load ${site}\n"
  site_load_time=$(curl -o /dev/null -s -w "time_connect: %{time_connect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}" "${site}")
  site_access=$(curl -o /dev/null -s -w %{http_code} "${site}")
  time_total=${site_load_time##*:} 

  printf "$(date '+%Y-%m-%d %H:%M:%S')\n"
  printf "site load time\n${site_load_time}\n"
  printf "site access:${site_access}\n\n" 

  # not send
  if [ "$REMARK" = "" ]; then
    # check access
    if [ "$time_total" = "0.000" ] || [ "$site_access" != "200" ]; then
      echo "Subject: ${site} can access $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}
      ISSEND=1
    else
      # check load time
      if [ "${time_total%%.*}" -ge ${MAXLOADTIME} ]; then
        echo "Subject: ${site} load time total:${time_total} $(date +%Y-%m-%d' '%H:%M:%S)" | sendmail ${NOTICE_EMAIL}
        ISSEND=1
      fi
    fi
  fi 

done 

# 发送电邮后记录发送时间
if [ "$ISSEND" = "1" ]; then
  echo "$(date +%s)" > $REMARKFILE
fi 

exit 0 
(0)

相关推荐

  • Linux下的硬件安装

    1.安装 Linux 要占用多少硬盘空间? 决定于要安装什么distribution的Linux,以及需要装入多少应用程序,是否安装原代码等. 例如最基本的Slackware Linux大约需要10MB的空间,包括X Windows则要80M,假如要把基本系统工具程序.常用应用软件以及TCP/IP网络软件安装的话 ( 即A.B.N系列编号软件),差不多40-50MB,如要全部安装,大约200MB左右. 至于RedHat Linux,最小化安装(仅仅最基本的系统)大约需要60M,缺省安装大约要25

  • 基于Linux系统中查看硬件等信息的方法详解

    本文介绍下,linux下查看硬件信息的命令与方法,包括主板序列号.cpu信息.内存信息.硬盘信息.网卡信息等.1,主板信息.查看主板的序列号 #使用命令dmidecode | grep -i 'serial number'#查看板卡信息cat /proc/pci 2,cpu信息 #通过/proc文件系统1) cat /proc/cpuinfo#通过查看开机信息2) dmesg | grep -i 'cpu'#3)dmidecode -t processor3,在linux系统中查看硬盘信息,常用

  • Ubuntu中为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序

    在Ubuntu Android简单介绍硬件抽象层(HAL)一文中,我们简要介绍了在Android系统为为硬件编写驱动程序的方法.简单来说,硬件驱动程序一方面分布在Linux内核中,另一方面分布在用户空间的硬件抽象层中.接着Ubuntu Android系统上编写Linux内核驱动程序实现方法一文中举例子说明了如何在Linux内核编写驱动程序.在这一篇文章中,我们将继续介绍Android系统硬件驱动程序的另一方面实现,即如何在硬件抽象层中增加硬件模块来和内核驱动程序交互.在这篇文章中,我们还将学习到

  • Linux常用查看硬件设备信息命令大全(值得收藏)

    # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod # 列出加载的内核模块 # env # 查看环境变量 资源 # free -m # 查看内存使用量和交换区使用量 # df -h # 查看各分区使用情况 # du

  • Linux服务器硬件运行状态及故障邮件提醒的监控脚本分享

    监控硬件运行状况 shell 监控cpu,memory,load average,记录到log,当负载压力时,发电邮通知管理员. 原理: 1.获取cpu,memory,load average的数值 2.判断数值是否超过自定义的范围,例如(CPU>90%,Memory<10%,load average>2) 3.如数值超过范围,发送电邮通知管理员.发送有时间间隔,每小时只会发送一次. 4.将数值写入log. 5.设置crontab 每30秒运行一次. ServerMonitor.sh #

  • WordPress中访客登陆实现邮件提醒的PHP脚本实例分享

    登陆邮件提醒实现方法 前提是空间有邮件功能,测试有无邮件功能的方法:登录界面点击"忘记密码",有邮件发到你邮箱就有邮件功能. 一.登录成功提醒 就像银行的登录提醒一样,如果有人登录了系统,就会发一封邮件到邮箱,提醒你有人登录了,如果当时不是你登录,就要引起警惕了.将以下代码放入主题的functions.php中: /***************************************************** 函数名称:wp_login_notify v1.0 by DH.

  • 3个备份系统文件并邮件发送的Shell脚本分享

    1.安装MUTT邮件客户端 # yum install mutt -y 2.创建脚本 # vi /etc/rc.d/mail_to_bak_daily.sh 版本一: #!/bin/bash # ========================================================= # 请输入,你想让备份数据放置到哪个独立的目录区 basedir=/backup/daily # =============================================

  • Linux下Redis数据库的安装方法与自动启动脚本分享

    安装Redis  (1) 下载Redis wget http://redis.googlecode.com/files/redis-2.2.11.tar.gz tar xzvf redis-2.2.11.tar.gz  (2) 编译并安装Redis make && make install  (3) 复制并修改配置文件 cp redis.conf /etc/redis.conf vi /etc/redis.conf 注意修改以下几项: daemonize yes loglevel warn

  • linux使用QQ实现网络邮件报警功能

    环境: CentOS7目的: 考虑到实现服务的高可用性.使用电子邮件通知服务,可以快速的通知维护人员.提高服务的可靠性,而通过 smtp.qq.com 实现脚本邮件报警 一.设置并取得 smtp.qq.com 的 使用 授权密码 1.点击进入QQ邮箱 2.进入邮箱点击设置 3.点击帐号 4.点击开启SMTP 5.发送验证码 6.记住密码或修改密码 二.安装邮件客户端工具 [root@server-30 ~]# yum install mailx [root@server-30 ~]# vim /

  • 用Python自动发邮件提醒你周末吃啥

    目录 前言 实现思路 实现过程 总结 前言 前几天在Python交流群里边,大佬分享了一个有趣的代码,用于定时发送菜谱分享,觉得挺有意思,这里拿出来给大家分享. 实现思路 实现思路倒是不难,其一是Python网络爬虫,将网页上的每日一文抓取到,然后存起来到一个变量中,其二是编写发送邮件的逻辑,编辑好邮寄模板,然后将抓到的内容发送出去即可. 实现过程 这里直接上代码,如下所示: import requests, bs4 import smtplib import schedule import t

  • linux系统使用python获取cpu信息脚本分享

    linux系统使用python获取cpu信息脚本分享 复制代码 代码如下: #!/usr/bin/env Pythonfrom __future__ import print_functionfrom collections import OrderedDictimport pprint def CPUinfo():    ''' Return the information in /proc/CPUinfo    as a dictionary in the following format:

  • Linux系统下nginx日志每天定时切割的脚本写法

    使用Linux系统自带的命令logrotate对Nginx日志进行切割. Nginx安装目录:/usr/local/nginx/ Nginx日志目录:/usr/local/nginx/logs/./usr/local/nginx/logs/nginx_logs/ 1.添加nginx日志切割脚本 cd /etc/logrotate.d #进入目录 vi /etc/logrotate.d/nginx #编辑脚本 /usr/local/nginx/logs/*.log /usr/local/nginx

  • 几个常用的Linux操作系统监控脚本代码

    本文介绍了几个常用的Linux监控脚本,可以实现主机网卡流量.系统状况.主机磁盘空间.CPU和内存的使用情况等方面的自动监控与报警.根据自己的需求写出的shell脚本更能满足需求,更能细化主机监控的全面性. 最近时不时有互联网的朋友问我关于服务器监控方面的问题,问常用的服务器监控除了用开源软件,比如:cacti,nagios监控外是否可以自己写shell脚本呢?根据自己的需求写出的shell脚本更能满足需求,更能细化主机监控的全面性. 下面是我常用的几个主机监控的脚本,大家可以根据自己的情况再进

  • Linux/Docker 中使用 System.Drawing.Common 踩坑记录分享

    前言 在项目迁移到 .net core 上面后,我们可以使用 System.Drawing.Common 组件来操作 Image,Bitmap 类型,实现生成验证码.二维码,图片操作等功能.System.Drawing.Common 组件它是依赖于 GDI+ 的,然后在 Linux 上并没有 GDI+,面向谷歌编程之后发现,Mono 团队使用 C语言 实现了GDI+ 接口,提供对非Windows系统的 GDI+ 接口访问能力,这个应该就是libgdiplus.所以想让代码在 linux 上稳定运

随机推荐