shell监控脚本

时间:2023-02-24 23:07:09

序言:

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

    原文地址:http://www.splaybow.com/post/iis-6.0-7.0.html 公司的项目需要迁移到IIS7的目标机器中 在此做记录 原来server 2003系统 迁到2008 ...

  2. 使用Python中PIL图形库进行截屏

    目的:通过使用Python的一个图形库PIL(Python Image Library)对屏幕进行截图 步骤: 1.下载PIL(路径)并安装 2.新建文件“截屏.py”,右键Edit with IDL ...

  3. 使用 gpg 加密文件 - 通过 shell 或 php

    使用 gpg 加密文件 - 通过 shell 或 php 背景:客户提供私钥,并要求我方通过php把加密后的文件传输给他们. 环境 macOS Sierra 10.12.1 php 7.0.8 0.安 ...

  4. SQL Server读懂语句运行的统计信息 SET STATISTICS TIME IO PROFILE ON

    对于语句的运行,除了执行计划本身,还有一些其他因素要考虑,例如语句的编译时间.执行时间.做了多少次磁盘读等. 如果DBA能够把问题语句单独测试运行,可以在运行前打开下面这三个开关,收集语句运行的统计信 ...

  5. Linux Window Redis安装

    Linux 下简易的安装过程: 1.源码安装之前要先安装gcc,不然编译会出错, 2.下载源码,去http://download.redis.io/releases/这个文件夹内找想安装的版本,我下载 ...

  6. UICollectionView基础学习

    相信了解UICollectionView的也一定听过瀑布流吧,开始之前先提供两个瀑布流,有时间的可以深入研究研究 https://github.com/dingpuyu/WaterFall https ...

  7. C#获取网页内容 (WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)

    获取网页数据有很多种方式.在这里主要讲述通过WebClient.WebBrowser和HttpWebRequest/HttpWebResponse三种方式获取网页内容. 这里获取的是包括网页的所有信息 ...

  8. Qt之对话框消失动画

    一.效果展示 最近做了一个提示框消失的功能,觉着挺有意思,以前一直以为Qt子窗口不能做淡出效果,其实Qt的淡出功能已经帮我们封装好了,我们仅仅只需要几行代码就可以做出酷炫的窗口关闭效果,写此篇文章的时 ...

  9. ELK系列~nxlog实现多位置文件的收集

    前几天我写了几篇关于ELK日志收集,存储和分析的文章: ELK系列~NLog.Targets.Fluentd到达如何通过tcp发到fluentd ELK系列~Nxlog日志收集加转发(解决log4日志 ...

  10. C#图解教程 第二十三章 预处理指令

    预处理指令 什么是预处理指令基本规则#define和#undef指令条件编译条件编译结构诊断指令行号指令区域指令#pragma warning 指令 预处理指令 什么是预处理指令 源代码指定了程序的定 ...