shell监控mysql发邮件_用shell脚本监控linux系统 自动发送邮件

此脚本可以做一个定时的检测,超出设定的值,即往邮箱发送警告

脚本用到bc,sendmail,163邮箱,yum install bc#!/bin/bash

#System Monitoring Script

while [ 1 ]

do

#本机需开启postfix或sendmail服务。

#报警邮件地址设置

MAILFROM=root@localhost

MAILTO=your_mail@163.com

#设置脚本运行间隔时间。单位(秒)。

RUNTIME=900

#内存使用率监控设置,单位 (%)

MEMTHRE=80

#流量监控设置

#要监控的网卡

ETHX=eth0

#填写大于多少MB的时候发送警报,单位(MB)

INFLOWTHREMB=50

OUTFLOWTHREMB=50

#填写大于多少KB的时候发送警报,单位(KB)

INFLOWTHREKB=8000

OUTFLOWTHREKB=8000

#TCP连接状态数量监控设置

#填写最大连接的个数

TIME_WAIT=4000

FIN_WAIT1=500

FIN_WAIT2=200

ESTABLISHED=4000

SYN_RECV=100

CLOSE_WAIT=100

CLOSING=1000

LAST_ACK=3000

#CPU使用率监控设置

#填写cpu使用率大于多少发送报警,单位(%)

CPUTHRE=60

#硬盘使用大小设置

#填写硬盘占用率,单位(%)

ROOT=80

VAR=100

USR=100

BOOT=80

#调试模式开关。(YES/NO)

DBUG=NO

# 监 控 脚 本 执 行 内 容

################################################################################

time=`date +"%Y-%m-%d %H:%M:%S"`

#内存监控部分

NULL=/dev/null

MEM=`free -m |grep Mem |awk '{print $3/$2*100}'`

MEMB=`free -m |grep Mem |awk '{print $2,$4+$6+$7}'|awk '{print $1,$1-$2}'| awk '{print $2/$1*100}'`

memuse=`free -m|grep "buffers/cache"|awk '{print $3}'`

memtotal=`free -m|grep "Mem"|awk '{print $2}'`

memory=`echo "$memuse/$memtotal*100"|bc -l|cut -d. -f1`

MA=`expr $memory \> $MEMTHRE `

if [ $MA -eq 1 ] ; then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time MEM内存警告,当前内存占用率为$MEM %,大于$MEMTHRE %.

EOF

fi

MB=`expr $MEMB \> $MEMTHRE`

if [ $MB -eq 1 ] ; then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time MEMB内存警告,当前内存占用率为$MEMB %,大于$MEMTHRE %

EOF

fi

#流量监控部分

FLOWA=/tmp/.flow

ifconfig $ETHX |grep "RX byte" |awk '{print $2" "$6}' |awk -Fbytes: '{print "INPUT "$2"OUTPUT "$3}'\ > $FLOWA

INPUTA=`cat $FLOWA |awk '{print $2}'`

OUTPUTA=`cat $FLOWA |awk '{print $4}'`

sleep 1

ifconfig $ETHX |grep "RX byte" |awk '{print $2" "$6}' |awk -Fbytes: '{print "INPUT "$2"OUTPUT "$3}'\ > $FLOWA

INPUTB=`cat $FLOWA |awk '{print $2}'`

OUTPUTB=`cat $FLOWA |awk '{print $4}'`

INPUTC=`echo "$INPUTB-$INPUTA" | bc`

OUTPUTC=`echo "$OUTPUTB-$OUTPUTA"| bc`

INPUTMBA=`echo "$INPUTC/1024"|bc`

OUTPUTMBA=`echo "$OUTPUTC/1024"|bc`

INMBF=/tmp/.inputMB

OUTMBF=/tmp/.outputMB

echo `echo "scale=4;$INPUTMBA/1024"|bc`MB > $INMBF

echo `echo "scale=4;$OUTPUTMBA/1024"|bc`MB > $OUTMBF

INMB=`cat $INMBF |awk '{print $1}'`

OUTMB=`cat $OUTMBF |awk '{print $1}'`

if [ $INPUTMBA -gt 1024 ] ; then

if [ $INMB -gt $INFLOWTHREMB ] ;then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 流量警告,当前流量异常,请登录服务器查看。当前速率$INMB MB/秒,大于$INFLOWTHREMB MB/秒。

EOF

fi

if [ $OUTMB -gt $OUTFLOWTHREMB ] ;then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 流量警告,当前流量异常,请登录服务器查看。当前速率$OUTMB MB/秒 大于$OUTFLOWTHREMB MB/秒。

EOF

fi

else

INKBF=/tmp/.inputKB

OUTKBF=/tmp/.outputKB

echo $INPUTMBA KB > $INKBF

echo $OUTPUTMBA KB > $OUTKBF

INKB=`cat $INKBF |awk '{print $1}'`

OUTKB=`cat $OUTKBF |awk '{print $1}'`

if [ $INKB -gt $INFLOWTHREKB ] ; then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 流量警告,当前流量异常,请登录服务器查看。$INKB KB/秒 大于$INFLOWTHREKB KB/秒。

EOF

fi

if [ $OUTKB -gt $OUTFLOWTHREKB ] ;then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 流量警告,当前流量异常,请登录服务器查看。当前速率$OUTKB KB/秒大于$INFLOWTHREKB KB/秒。

EOF

fi

fi

#连接数

tcpfile=/tmp/.tcp

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' >$tcpfile

grep TIME_WAIT $tcpfile > $NULL

if [ $? -eq 1 ] ; then

echo "TIME_WAIT 0 " >> $tcpfile

fi

grep FIN_WAIT1 $tcpfile > $NULL

if [ $? -eq 1 ] ; then

echo "FIN_WAIT1 0 " >> $tcpfile

fi

grep FIN_WAIT2 $tcpfile > $NULL

if [ $? -eq 1 ] ; then

echo "FIN_WAIT2 0 " >> $tcpfile

fi

grep CLOSE_WAIT $tcpfile > $NULL

if [ $? -eq 1 ] ; then

echo "CLOSE_WAIT 0 " >> $tcpfile

fi

grep LAST_ACK $tcpfile > $NULL

if [ $? -eq 1 ] ; then

echo "LAST_ACK 0 " >> $tcpfile

fi

grep SYN_RECV $tcpfile > $NULL

if [ $? -eq 1 ] ; then

echo "SYN_RECV 0 " >> $tcpfile

fi

grep CLOSING $tcpfile > $NULL

if [ $? -eq 1 ] ; then

echo "CLOSING 0 " >> $tcpfile

fi

grep ESTABLISHED $tcpfile > $NULL

if [ $? -eq 1 ] ; then

echo "ESTABLISHED 0 " >> $tcpfile

fi

TIME_WAITV=`grep TIME_WAIT $tcpfile | awk '{print $2}'`

FIN_WAIT1V=`grep FIN_WAIT1 $tcpfile | awk '{print $2}'`

FIN_WAIT2V=`grep FIN_WAIT2 $tcpfile | awk '{print $2}'`

ESTABLISHEDV=`grep ESTABLISHED $tcpfile | awk '{print $2}'`

SYN_RECVV=`grep SYN_RECV $tcpfile | awk '{print $2}'`

CLOSINGV=`grep CLOSING $tcpfile | awk '{print $2}'`

CLOSE_WAITV=`grep CLOSE_WAIT $tcpfile | awk '{print $2}'`

LAST_ACKV=`grep LAST_ACK $tcpfile | awk '{print $2}'`

if [ $ESTABLISHEDV -gt $ESTABLISHED ] ; then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 连接数警告,当前ESTABLISHED连接数异常,请登录服务器查看。当前连接数为$ESTABLISHEDV个,大于$ESTABLISHED个

EOF

fi

if [ $SYN_RECVV -gt $SYN_RECV ] ; then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 连接数警告,当前SYN_RECV连接数异常,请登录服务器查看。当前连接数为$SYN_RECVV个,大于$SYN_REC个。

EOF

fi

if [ $CLOSE_WAITV -gt $CLOSE_WAIT ] ; then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 连接数警告,当前CLOSE_WAIT连接数异常,请登录服务器查看。当前连接数为$CLOSE_WAITV个,大于$CLOSE_WAIT个。

EOF

fi

if [ $CLOSINGV -gt $CLOSING ] ; then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 连接数警告,当前CLOSING连接数异常,请登录服务器查看。当前连接数为$CLOSINGV个,大于$CLOSING个。

EOF

fi

if [ $LAST_ACKV -gt $LAST_ACK ] ; then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 连接数警告,当前LAST_ACK连接数异常,请登录服务器查看。当前连接数为$LAST_ACKV个,大于$LAST_ACK个。

EOF

fi

if [ $TIME_WAITV -gt $TIME_WAIT ] ; then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 连接数警告,当前TIME_WAIT连接数异常,请登录服务器查看。当前连接数为$TIME_WAITV个,大于$TIME_WAIT个。

EOF

fi

if [ $FIN_WAIT1V -gt $FIN_WAIT1 ] ; then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 连接数警告,当前FIN_WAIT1连接数异常,请登录服务器查看。当前连接数为$FIN_WAIT1V个,大于$FIN_WAIT1个。

EOF

fi

if [ $FIN_WAIT2V -gt $FIN_WAIT2 ] ; then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 连接数警告,当前FIN_WAIT2连接数异常,请登录服务器查看。当前连接数为$FIN_WAIT2V个,大于$FIN_WAIT2个。

EOF

fi

DISKF=/tmp/.disk

df -h > $DISKF

grep var $DISKF > $NULL

if [ $? -eq 1 ] ; then

echo "/dev/sda1 20G 1.6G 17G 0% /var" >> $DISKF

fi

grep usr $DISKF > $NULL

if [ $? -eq 1 ] ; then

echo "/dev/sda1 20G 1.6G 17G 0% /usr" >> $DISKF

fi

grep boot $DISKF > $NULL

if [ $? -eq 1 ] ; then

echo "/dev/sda1 20G 1.6G 17G 0% /boot" >> $DISKF

fi

BOOTV=`cat $DISKF | grep boot | awk '{print $5}'|awk -F% '{print $1}'`

VARV=`cat $DISKF | grep var | awk '{print $5}'|awk -F% '{print $1}'`

USRV=`cat $DISKF | grep usr | awk '{print $5}'|awk -F% '{print $1}'`

grep VolGroup $DISKF > $NULL

if [ $? -eq 0 ] ;then

ROOTV=`cat $DISKF | sed -n '3p' |awk '{print $4}'|awk -F% '{print $1}'`

else

ROOTV=`cat $DISKF | sed -n '2p'|awk '{print $5}'|awk -F% '{print $1}'`

fi

if [ $ROOTV -gt $ROOT ] ; then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 磁盘使用警告,您监控的 / 分区已经大于你设置的数值$ROOT %,详情登陆系统查看,目前使用率为$ROOTV %.

EOF

fi

if [ $VARV -gt $VAR ] ; then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 磁盘使用警告,您监控的 /var 分区已经大于你设置的数值$VAR %,详情登陆系统查看,目前使用率为$VARV %.

EOF

fi

if [ $BOOTV -gt $BOOT ] ; then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 磁盘使用警告,您监控的 /boot 分区已经大于你设置的数值 $BOOT %,详情登陆系统查看,目前使用率为$BOOTV %.

EOF

fi

if [ $USRV -gt $USR ] ; then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 磁盘使用警告,您监控的 /usr 分区已经大于你设置的数值$USR %,详情登陆系统查看,目前使用率为$USRV %.

EOF

fi

CPURATE=`top -b -n 1 |grep Cpu | awk '{print $2}' |awk -F. '{print $1}'`

CB=`expr $CPURATE \> $CPUTHRE`

if [ $CB -eq 1 ] ; then

sendmail -t <

from: $MAILFROM

to:$MAILTO

subject:67warning

$time 使用警告,您监控的CPU使用率,已经超过您设置的限额$CPUTHRE %,当前CPU使用率为$CPURATE .

EOF

fi

DBUGS=YES

if [ "$DBUGS" == "$DBUG" ] ; then

echo " "'== 内 存 ==' ;echo \ ;

echo " "当前程序占用内存为 $MEMB % ,总占用内存为 $MEM % ; echo \ ;

echo " "'== 流 量 =='; echo \ ;

YA=`wc -l $INMBF > /dev/null 2>&1 ; echo $?`

if [ $YA -eq 1 ] ; then

echo 0 > $INMBF

fi

IN=`expr $INMB \> $INFLOWTHREMB >$NULL; echo $? ` 2> $NULL

if [ $IN -eq 1 ] ; then

echo " "当前输入流量为 $INMB MB/秒 .;

echo " "当前输入流量为 $INKB KB/秒 .;

fi

YB=`wc -l $OUTMBF > /dev/null 2>&1 ; echo $?`

if [ $YB -eq 1 ] ; then

echo 0 > $OUTMBF

fi

OUT=`expr $OUTMB \> $OUTFLOWTHREMB >$NULL ; echo $?` 2> $NULL

if [ $OUT -eq 1 ] ; then

echo " "当前输出流量为 $OUTMB MB/秒。 ;

echo " "当前输出流量为 $OUTKB KB/秒。 ; echo \ ;

fi

echo " "'== 连接数 ==' ; echo \ ;

echo " "当前TIME_WAIT" " 连接数为 $TIME_WAITV 个。

echo " "当前FIN_WAIT1" " 连接数为 $FIN_WAIT1V 个。

echo " "当前FIN_WAIT2" " 连接数为 $FIN_WAIT2V 个。

echo " "当前CLOSE_WAIT" " 连接数为 $CLOSE_WAITV 个。

echo " "当前ESTABLISHED"" 连接数为 $ESTABLISHEDV 个。

echo " "当前SYN_RECV" " 连接数为 $SYN_RECVV 个。

echo " "当前LAST_ACKV" " 连接数为 $LAST_ACKV 个。

echo " "当前CLOSING" " 连接数为 $CLOSINGV 个。; echo \ ;

echo " "'== CPU使用率 ==' ; echo \ ;

echo " "当前CPU 进程使用率为 $USERATE . ;echo \ ;

echo " "'== 磁盘使用率 ==' ; echo \ ;

echo " "当前" "/" "分区," "使用率为 $ROOTV %.

echo " "当前/var 分区, 使用率为 $VARV %.

echo " "当前/boot分区, 使用率为 $BOOTV %.

echo " "当前/usr 分区, 使用率为 $USRV %.

exit

fi

sleep $RUNTIME

done

脚本42行,先改为DBUG=YES,运行一次,如果没问题,出现下面提示

eb4e74f9a07a54136d44bd9db2646a01.png

再把DBUG=NO改回来

附,邮件通知

26fd5869159c0a2effe361d1703f3713.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】01-C语言概述

说明&#xff1a;这个C语言专题&#xff0c;是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员&#xff0c;能够快速上手C语言。如果你还没有编程经验&#xff0c;或者对C语言、iOS开发不感兴趣&#xff0c;请忽略 回到顶部为什么iOS开发要先学C语言&#xff1f; i…

删除 索引 外键 mysql_MySQL外键及级联删除 表的存储引擎与创建索引 删除数据库和表...

Messages表&#xff1a;mysql>create table Messages(->message_id int auto_increment primary key,->user_name varchar(50) not null,->author_id int not null,->body text,->forum_id int not null);Forums表&#xff1a;mysql>create table Forums(…

字符串长度(PHP学习)

1.计算字符串长度有哪些方法&#xff1f; 答&#xff1a;strlen() 和 mb_strlen() 2.两者有什么区别 答&#xff1a; 如下代码 <?php $str hello中国; ?>strlen($str)计算的是字节的长度&#xff0c;在utf8下一个汉字代表3个字符&#xff0c;算出来是11 在GB2312和…

eclipse在ubuntu13.04下崩溃crash

错误信息&#xff1a; # # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc0x00007fb29dce2009, pid19297, tid140405947455232 # # JRE version: 7.0_10-b18 # Java VM: Java HotSpot(TM) 64-Bit Server VM (23.6-b04 mixed mode…

Java IO 体系结构

参考文章地址: http://blog.csdn.net/oracle_microsoft/article/details/2634231 Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点: 1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系 2.…

java wap_JAVA和WAP移动学习技术

JAVA和WAP移动学习技术JAVA/WAP移动学习技术摘 要 移动学习是今后课堂学习的必要补充&#xff0c;WAP技术是基于连接浏览的移动学习关键技术。本文以移动电话学生成绩查询系统为例&#xff0c;利用UML模型表征实现的过程&#xff0c;分析其运用的WML 、SERVLET与连接池等技术。…

java string 日期格式_java String.Format() 日期格式用法

JDK1.5中&#xff0c;String类新增了一个很有用的静态方法String.format():现有一个时间20090903要转化成指定时间的java.util.Date格式private Date getStartGregorianTime(String date) {Date d_date DateUtil.parseDate(date);int year new Integer(String.format("%…

java HHmm_java date HHmmss hhmmss

系统交互时&#xff0c;用到时间流水号的设计&#xff0c;出现时间流水号相同的情况&#xff0c;故对时间格式化各种情况做了研究SimpleDateFormat(format)format&#xff1a;年月日 yyyyMMdd时分秒 HHmmss 24小时制时分秒 hhmmss 12小时制年月日时分秒 yyyyMMddHHmmss …

MySql命令——命令行客户机的分隔符

delimiter //create procedure productpricint() begin select avg(price) as priceaveragefrom product; end //delimiter; 转载于:https://www.cnblogs.com/Luoma_HaoWei/p/3270889.html

NuGet学习笔记(1)——初识NuGet及快速安装使用

关于NuGet园子里已经有不少介绍及使用经验&#xff0c;本文仅作为自己研究学习NuGet一个记录。 初次认识NuGet是在去年把项目升级为MVC3的时候&#xff0c;当时看到工具菜单多一项Library Package Manager&#xff0c;右键项目文件多了一项Manage Nuget Packages...&#xff0c…

java 打印二叉树_java – 如何打印二叉树图?

我创建了简单的二叉树打印机。你可以根据需要使用和修改它&#xff0c;但它还没有优化。我认为很多东西都可以在这里改进;import java.util.ArrayList;import java.util.Collections;import java.util.List;public class BTreePrinterTest {private static Node test1() {Node …

ZOJ 2562 More Divisors

又是个水题&#xff0c;刚刚开始没有用搜索&#xff0c;因为对于反素数有&#xff1a; n2^t1*3^t2^5^t3*7^t4..... 这里有 t1>t2>t3>t4。 而且相同的因数的情况下&#xff0c;素数越不同越好。 哪知道这个方法错了&#xff01; 。 看来还得中规中矩得用dfs。 我觉得还…

springMVC使用注解方式进行页面跳转

<!--控制层-->package cn.org.spartacus.spring; import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;ControllerRequestMapping("…

java for 和foreach_关于java中for和foreach循环

for循环中的循环条件中的变量只求一次值&#xff01;具体看最后的图片foreach语句是java5新增&#xff0c;在遍历数组、集合的时候&#xff0c;foreach拥有不错的性能。foreach是for语句的简化&#xff0c;但是foreach并不能替代for循环。可以这么说&#xff0c;任何foreach都能…

将datatable导出为excel的三种方式(转)

一、使用Microsoft.Office.Interop.Excel.DLL 需要安装Office 代码如下&#xff1a; 2 publicstaticboolExportExcel(System.Data.DataTable dt, stringpath)3 {4 boolsucceed false;5 if(dt !null)6 {7 Microsoft.Office.Interop.Excel.Application xlApp null;8 try9 {10 xl…

java锁的实现方式_Java 集群锁如何实现呢?

针对分布式锁的实现&#xff0c;目前比较常用的有以下几种方案&#xff1a;基于数据库实现分布式锁 基于缓存(redis&#xff0c;memcached&#xff0c;tair)实现分布式锁 基于Zookeeper实现分布式锁基于数据库表要实现分布式锁&#xff0c;最简单的方式可能就是直接创建一张锁表…

java判断字符集_Java 常用工具类---- 各种字符集编码判断与转换

import java.io.UnsupportedEncodingException;/*** 判断字符编码** author guyinyihun*/public class CharacterCodingUtil {private final static String ENCODE "GBK";/*** 判断是否为ISO-8859-1** return*/public static boolean checkISO(String str) {boolean…

只安装和配置instantclient,用plsql developer,navicat for oracle,sqlplus连接oracle数据库 ....

环境配置&#xff1a; 1.到oracle官网下载instantclient basic包&#xff0c;解压缩到E:\oracle\instantclient_11_2&#xff1b; 2.设置环境变量 NLS_lANGSIMPLIFIED CHINESE_CHINA.ZHS16GBK&#xff08;注意中间有空格&#xff0c;这个如果不设&#xff0c;toad查询中文会是乱…