序言:

前几天一好友问我服务器监控怎么做?你们公司的监控是怎么做的?有什么开源的监控软件推荐?常见的开源的监控软件当然首先推荐ZABBIX,分布式够强大,而且很多公司都在用,我问他具体什么需求,能监控服务器负载、CPU使用率、内存使用率、硬盘使用率、网卡流量监控、网站PV,UV统计、异常错误日志,一旦超出设定的阈值就发邮件告警。确定需求后准备将ZABBIX的一些参考资料发给他看看,末了问了一句,你们有多少台机器,他说就3台,一个在线商城网站,哈哈...就3台机器整毛线ZABBIX,用shell脚本吧,用了一天时间给写了个初版的shell监控脚本,效果如下图:

监控项:

  • 15分钟的系统平均负载
  • CPU使用率
  • 内存使用率
  • 虚拟内存使用率
  • 硬盘使用率
  • 网卡流量
  • 网站PV统计
  • 网站UV统计

邮件发送设置:

  • 每小时监控监控1次,超出设置的阀值就发送邮件通知。
  • 每天08:00发送邮件,上班后可查看前天服务器运行情况。

1.监控脚本


 #!/usr/bin/env  bash
#
# Author : Jack zhao
# Data : //
# Description: This script is used to monitor the use of local system resources. ###The global variable###
export PATH=$PATH:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
export LANG=C
INITDIR=`pwd`
LOCAL_TIME=`date '+%F %H:%M:%S'`
BEFORE_DAY=`date -d "-1 days" +%F`
WHOLE_TIME=`date '+%H'` ###Mailbox configuration###
ACCENT_MAIL="123456@126.com" ###The alarm threshold###
LOAD_AVERAGE_ALARM=
CPU_ALARM=
MEMORY_ALARM=
SWAP_ALARM=
ROOT_PART_ALARM=
IN_NETWORK_TRAFFIC_ALARM=
OUT_NETWORK_TRAFFIC_ALARM= ###Log variable###
ACCESS_LOG_PATH=localhost_access_log.${BEFORE_DAY}.txt ####Timed task###
TIMING= ###Public function###
out_format(){
printf "%-22s %-5s %-5s \n" "$1" ":" "$2"
} ###Send an alarm mail###
send_mail(){
python mail.py "$ACCENT_MAIL" "[Alarm]:$1" "`cat $INITDIR/Monitoring.log`"
} ###Get load information minutes###
get_load_average(){
LOAD_AVERAGE=`uptime | awk -F "," '{print$NF}' | sed 's#[[:space:]]##g' `
out_format "Load average" "$LOAD_AVERAGE" >> $INITDIR/Monitoring.log
return
} ###Get CPU usage###
get_cpu_usage(){
CPU_FREE=`vmstat |sed -n '3,$p' |awk '{x = x + $15} END {print x/5}' |awk -F. '{print $1}'`
CPU_USAGE=$(( - $CPU_FREE))
out_format "CPU usage" "${CPU_USAGE}%" >> $INITDIR/Monitoring.log
return
} ###Get memory usage###
get_memory_usage(){
MEMORY_USED=`free -m | grep -w "buffers\/cache:" | awk '{print$3}'`
MEMORY_TOTAL=`free -m | grep "^Mem" | awk '{print$2}'`
MEMORY_USAGE=`echo "scale=2;${MEMORY_USED}/${MEMORY_TOTAL}*100;" | bc -l`
out_format "Memory usage" "${MEMORY_USAGE}%" >> $INITDIR/Monitoring.log
return
} ###Get Swap usage###
get_swap_usage(){
SWAP_USED=`free -m | grep -w "^Swap" | awk '{print$3}'`
SWAP_TOTAL=`free -m | grep -w "^Swap" | awk '{print$2}'`
SWAP_USAGE=`echo "scale=2;${SWAP_USED}/${SWAP_TOTAL}*100;" | bc -l`
out_format "Swap usage" "${SWAP_USAGE}%" >> $INITDIR/Monitoring.log
return
} ###Get disk usage###
get_disk_usage(){
MOUNT_POINT=`df -hP | egrep -wv '^tmpfs|Filesystem|boot' | awk '{print$NF}'`
for i in `echo $MOUNT_POINT`;do
DISK_USAGE=`df -hP | grep -w "$i" | awk '{print$5}'`
out_format "Disk usage $i" "${DISK_USAGE}" >> $INITDIR/Monitoring.log
done
ROOT_PART=`df -hP | grep -w "/" | awk '{print$5}' | awk -F "%" '{print$1}'`
return
} ###Get network traffic###
get_network_traffic(){
NETWORK_TRAFFIC=`sar -n DEV |grep Average|grep eth0|awk '{print "Input:",$5*1000*8,"bps","Output:",$6*1000*8,"bps"}'`
out_format "Network traffic" "${NETWORK_TRAFFIC}" >> $INITDIR/Monitoring.log
return
} ###Get website PV,UV###
get_website_pu(){
WEBSITE_PV=`grep -v "^127.0.0.1" ${ACCESS_LOG_PATH} | wc -l`
out_format "Before Day Website PV" "$WEBSITE_PV" >> $INITDIR/Monitoring.log
WEBSITE_UV=`grep -v "^127.0.0.1" ${ACCESS_LOG_PATH} | awk '{print$1}' | sort | uniq | wc -l`
out_format "Before Day Website UV" "$WEBSITE_UV" >> $INITDIR/Monitoring.log
} ###Server information###
IP=`ip addr show eth0 | grep -w "inet" | awk -F "[ /]+" '{print$3}'`
HOSTNAME=`hostname`
SN=`sudo -b /usr/sbin/dmidecode | grep -A5 "System Information" | grep "Serial Number"| awk -F ":" '{print$2}' | sed 's#^[[:space:]]##g'`
OS=`cat /etc/redhat-release` ###Program entrance###
echo "############### Monitoring information Date:$LOCAL_TIME ###############" > $INITDIR/Monitoring.log
out_format "IP" "$IP" >> $INITDIR/Monitoring.log
out_format "Hostname" "$HOSTNAME" >> $INITDIR/Monitoring.log
out_format "SN" "$SN" >> $INITDIR/Monitoring.log
out_format "Os" "$OS" >> $INITDIR/Monitoring.log ###Call function###
get_load_average
get_cpu_usage
get_memory_usage
get_swap_usage
get_disk_usage
get_network_traffic
get_website_pu ###variable format###
LOAD_AVERAGE_FORMAT=`echo $LOAD_AVERAGE | awk -F "." '{print$1}'`
MEMORY_USAGE_FORMAT=`echo $MEMORY_USAGE | awk -F "." '{print$1}'`
SWAP_USAGE_FORMAT=`echo $SWAP_USAGE | awk -F "." '{print$1}'`
IN_NETWORK_TRAFFIC=`echo $NETWORK_TRAFFIC | awk '{print$2}'`
OUT_NETWORK_TRAFFIC=`echo $NETWORK_TRAFFIC | awk '{print$5}'` ##Monitoring threshold judgment###
if [ ${LOAD_AVERAGE_FORMAT} -ge ${LOAD_AVERAGE_ALARM} ];then
send_mail "$IP Load:High load average."
elif [ $CPU_USAGE -ge $CPU_ALARM ]; then
send_mail "$IP CPU:usage greater than ${CPU_ALARM}%."
elif [ $MEMORY_USAGE_FORMAT -ge $MEMORY_ALARM ];then
send_mail "$IP Memory:usage greater than ${MEMORY_ALARM}%."
elif [ $SWAP_USAGE_FORMAT -ge $SWAP_ALARM ];then
send_mail "$IP Swap:usage greater than ${SWAP_ALARM}%."
elif [ $ROOT_PART -ge $ROOT_PART_ALARM ]; then
send_mail "$IP Root Partition:usage greater than ${ROOT_PART_ALARM}%."
elif [ $IN_NETWORK_TRAFFIC -ge $IN_NETWORK_TRAFFIC_ALARM ]; then
send_mail "$IP Network Traffic:Input Greater than ${IN_NETWORK_TRAFFIC_ALARM}bps."
elif [ $OUT_NETWORK_TRAFFIC -ge $OUT_NETWORK_TRAFFIC_ALARM ]; then
send_mail "$IP Network Traffic:Output Greater than ${OUT_NETWORK_TRAFFIC_ALARM}bps."
fi ###Record history log###
cat $INITDIR/Monitoring.log >> $INITDIR/Monitor_history.log ###Send a notification email at a time###
if [ "$WHOLE_TIME" == "$TIMING" ];then
python mail.py "$ACCENT_MAIL" "[Notice]:$IP Monitoring information" "`cat $INITDIR/Monitoring.log`"
fi ###Delete temporary files###
INITDIR_CONFIRM=${INITDIR:-/tmp}
rm -f $INITDIR_CONFIRM/Monitoring.log

2.发送邮件脚本

 #!/usr/bin/env python
#-*- coding: UTF-8 -*-
import os,sys
reload(sys)
sys.setdefaultencoding('utf8')
import getopt
import smtplib
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from subprocess import * def sendqqmail(username,password,mailfrom,mailto,subject,content):
gserver = 'smtp.qq.com'
gport = 465 try:
msg = MIMEText(unicode(content).encode('utf-8'))
msg['from'] = mailfrom
msg['to'] = mailto
msg['Reply-To'] = mailfrom
msg['Subject'] = subject smtp = smtplib.SMTP_SSL(gserver, gport)
smtp.set_debuglevel(0)
smtp.ehlo()
smtp.login(username,password) smtp.sendmail(mailfrom, mailto, msg.as_string())
smtp.close()
except Exception,err:
print "Send mail failed. Error: %s" % err def main():
to=sys.argv[1]
subject=sys.argv[2]
content=sys.argv[3]
sendqqmail('','gkhcvklnjyjsbgwic','123456@qq.com',to,subject,content)
if __name__ == "__main__":
main()

3.readme配置

 1.新建一个监控用户(monitor)
[root@mylab ~]# useradd monitor
[root@mylab ~]# passwd monitor 2.配置sudo
[root@mylab ~]# cp /etc/sudoers /etc/sudoers.bak.`date +'%F-%T'`
[root@mylab ~]# echo "monitor ALL=(root) NOPASSWD: /usr/sbin/dmidecode" >> /etc/sudoers
[root@mylab ~]# vim /etc/sudoers
# Defaults requiretty
将上面行注释掉
3.上传脚本文件至/home/monitor
mail.py #发送邮件脚本
monitor.sh #监控脚本 4.配置文件说明
mail.py #调用第三方邮箱发送邮件
以QQ邮件为例修改mail.py文件:(其他平台修改参数即可,一般公司都有邮件接口或者自己内网搭建一台邮件服务器)
gserver = 'smtp.qq.com'
gport = 465
sendqqmail('123456','gkhcvklnjyjsbgic','123456@qq.com',to,subject,content)
QQ邮箱用户名 IMAP/SMTP第三方登录授权码(QQ邮箱设置生成)QQ邮箱 monitor.sh #可监控负载、CPU、内存、SWAP、硬盘、网卡流量、网站PV/UV(需要根据需求修改)
###Mailbox configuration###
ACCENT_MAIL="123456@126.com" #告警接受邮箱 告警阀值,可根据需要修改
###The alarm threshold###
LOAD_AVERAGE_ALARM=2 #15分钟内的平均负载,参考:一般小于机器物理CPU个数
CPU_ALARM=70 #CPU使用率
MEMORY_ALARM=70 #内存使用率
SWAP_ALARM=30 #虚拟内存使用率
ROOT_PART_ALARM=70 #/挂载点硬盘使用率
IN_NETWORK_TRAFFIC_ALARM=167772160 #网卡每分钟接收流量20M
OUT_NETWORK_TRAFFIC_ALARM=167772160 #网络每分钟发送流量20M 应用日志路径
###Log variable###
ACCESS_LOG_PATH=localhost_access_log.${BEFORE_DAY}.txt Monitor_history.log #日志历史记录 5.定时发送邮件
####Timed task###
TIMING=08 #每天08点发生邮件 6.添加自动任务
[monitor@mylab ~]$ crontab -e
1 * * * * /bin/sh -c "/home/monitor/monitor.sh &>/dev/null" #每个小时的第一分钟执行一次

4.写的最后

目前在测试环境运行了一段时间,待优化后上生产。哈哈....

shell监控脚本的更多相关文章

  1. shell监控脚本实例—监控mysql主从复制

    分享一例shell脚本,用于监测mysql数据库的主从复制,有需要的朋友不妨参考学习下. 转自:http://www.jbxue.com/article/14103.html(转载请注明出处) 本节内 ...

  2. linux100day(day8)--shell监控脚本练习

    这是一个大型的监控脚本,方便于查看硬盘,网络,负载,内核版本等系统信息. 本脚本来自于github的atarallo,我对脚本做出了改编和一些注释,尽量让新手也能理解,这个脚本逻辑清楚简单,适合用于练 ...

  3. shell监控脚本,不考虑多用户情况

    #!/bin/bash CheckProcess() { if [ "$1" = "" ]; then fi PROCESS_NUM=`ps -ef | gre ...

  4. centos shell编程6一些工作中实践脚本 nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志 直接送给bc做计算 gzip innobackupex/Xtrabackup 第四十节课

    centos   shell编程6一些工作中实践脚本   nagios监控脚本 自定义zabbix脚本 mysql备份脚本 zabbix错误日志  直接送给bc做计算  gzip  innobacku ...

  5. Linux 服务器系统监控脚本 Shell【转】

    转自: Linux 服务器系统监控脚本 Shell - 今日头条(www.toutiao.com)http://www.toutiao.com/i6373134402163048961/ 本程序在Ce ...

  6. 第五部分shell项目一监控脚本

    需求: 使用shell定制各种个性化告警工具,但需要统一化管理.规范化管理. 思路:指定一个脚本包,包含主程序.子程序.配置文件.邮件引擎.输出日志等.主程序:作为整个脚本的入口,是整个系统的命脉.配 ...

  7. zabbix客户端监控脚本shell

    zabbix客户端监控脚本shell #!/bin/sh sleep 3 zabbixdir=`pwd` zabbix_version=4.2.5 ###指定版本,最好和server端吻合版本,可以自 ...

  8. Linux系统性能统计工具Sar和实时系统性能监控脚本

    sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况.系统调用的使用情 ...

  9. oracle监控脚本

    简单命令 1.显示服务器上的可用实例:ps -ef | grep smon2.显示服务器上的可用监听器:ps -ef | grep -i listener | grep -v grep3.查看Orac ...

随机推荐

  1. .net core 2.0 WIndows IIS下发布(WIN 10环境)

    最近在做练习,发布.net core webapi在本机IIS上,使用.net core的文件系统发布到IIS后,出现错误 500.19 观察了下页面如下 查阅资料才知道是少安装了一个DotNetCo ...

  2. 【CCPC-Wannafly Winter Camp Day3 (Div1) G】排列(水题)

    点此看题面 大致题意:已知 \(p\)为\(n\)的一个排列,定义\(A(p)_i=min_{j=1}^ip_j\),若用\(q_i\)表示\(p\)第\(i\)小的前缀的长度(以值为第一关键字,下标 ...

  3. 课程设计__继承与派生,重载<<

    ///继承与派生 #include <iostream> using namespace std; class Point { public: Point (,):x(a),y(b) {} ...

  4. setTimeout详解

    一.setTimeout基础 setTimeout(func|code,delay); 第一个参数表示将要推迟的函数名或者一段代码,第二个参数表示推迟执行的毫秒数   eg: console.log( ...

  5. xshell 连接虚拟机过程

    (1)Ctrl+Shift+T 打开终端 terminal (2)ifconfig得到ip网络地址 (3)ssh安装已经打开ssh服务 (4)安装openssh-server sudo apt ins ...

  6. 曲率(Curvature)

    原文链接 几何体的曲率对于不同的对象有不同的定义.首先来看最简单的平面曲线. 首先把曲线分成无穷小的小段,每一段看作某个圆的一小段圆弧.这个圆叫做“密切圆”(Osculating Circle).由于 ...

  7. jQuery实现轮播切换以及将其封装成插件(3)

    在前两篇博文中,我们写了一个普通的轮播切换.但是我们不能每一次需要这个功能就把这些代码有重新敲一次.下面我们就将它封装成一个插件. 至于什么是插件,又为什么要封装插件,不是本文考虑的内容.  我们趁着 ...

  8. mysql完全卸载大全

    如何在Linux下卸载MySQL数据库呢? 下面总结.整理了一下Linux平台下卸载MySQL的方法. MySQL的安装主要有三种方式:二进制包安装(Using Generic Binaries).R ...

  9. AMD、CMD和CommonJS规范(转)

    CommonJS规范  CommonJS是在浏览器环境之外构建JavaScript生态系统为目标产生的项目,比如服务器和桌面环境中.CommonJS规范是为了解决JavaScript的作用域问题而定义 ...

  10. pod 指令无效

    到了新公司,配置pod,死活找不到pod指令,用了很多方法之后,找到了解决办法 sudo vim .bash_profile 然后添加 export PATH=/usr/local/bin:$PATH ...