Jquery中文网 www.jquerycn.cn
Jquery中文网 >  脚本编程  >  shell  >  正文 监控linux服务器性能的shell脚本

监控linux服务器性能的shell脚本

发布时间:2014-12-07   编辑:www.jquerycn.cn
分享一例shell脚本,用于日常运维中Linux服务器的性能监控,脚本写的不错,功能上很强大,有需要的朋友参考下吧。

本节内容:
一例监控linux 服务器性能的shell脚本。

情景描述:
公司有在用的监控平台,但有时会因为网络/端口开放等原因无法部署至平台上。
所以,考虑写个脚本监控linux系统的性能,该平台有短信网关接口所以告警信息会直接插入表,如果没有请改为邮件等其它方式。此方法可做为监控平台的一种补充。

该脚本在处理上没考虑太多异常情况处理,仅提供一种思路,欢迎大家修正补齐。
另外,该脚本目前都是单台处理。如果有多台可以再加个壳做个管理调用。

下面为大家作详细的介绍。

1,配置文件:
 

;monitor配置文件

;;程序目录
HomeDir=/home/oracle/monitor
;;程序bin
;;配置cfg
;;日志log/monitor

;;告警指标,依次为:CPU占用率,内存占用率,系统平均负载,硬盘空间,硬盘I/O
PoleCpu=90
PoleMem=90
PoleLad=5
PoleIde=90
PoleHOI=102
;;监测程序,用空格隔开
EXE=ora_
;;短信发送号码
TELNO=1865010**** 1315925****

用于监控Linux操作系统性能的shell脚本代码:
 

复制代码 代码示例:

#!/bin/bash
#监控系统状态,建议每分钟执行一次,一天一个文件,监控以下信息
#登陆用户、平均负载、占用内存,CPU,SWAP百分比、磁盘写入状态、网络流量与硬盘空间
#每5分钟检测一次,发现异常,写入邮件告警 www.jquerycn.cn
#需要安装包sysstat-9.0.5.tar.gz、ifstat-1.1.tar.gz
#20091210:更改配置文件方式,便于维护
#for pengl 20091116
#for wanggy 20130608 去掉邮件告警,可配置模块监控
#for wanggy 20130816 增加程序事件处理
#============================================================
InvalidDatetime=`date -d "+6 hours" "+%Y-%m-%d %H:%M:%S"`
curr_date=`date "+%Y-%m-%d %H:%M:%S"`
echo $curr_date
#============================================================
readcfg()
{
    cat /home/oracle/monitor/cfg/monitor.cfg|sed -e '/^;/d;/^$/d'|awk -F= '$1=="'$1'" {print $2}'
}
run_env()
{
#通过readcfg函数 读取monitor.cfg 相应的配置值
HomeDir="`readcfg HomeDir`"
WorkDir="$HomeDir/bin"
LogDir="$HomeDir/log"
PoleCpu=`readcfg PoleCpu`
PoleMem=`readcfg PoleMem`
PoleLad=`readcfg PoleLad`
PoleIde=`readcfg PoleIde`
PoleHOI=`readcfg PoleHOI`
EXE="`readcfg EXE`"
TELNO="`readcfg TELNO`"
#取系统相应的变量值
cd $WorkDir
echo $WorkDir
DATE=$(date +%Y%m%d)
TIME=$(date +"%H:%M:%S")
IP=$(/sbin/ifconfig eth0|sed -n "2p"|awk -F "[ ]+|:" '{print $4}')
USER=$(/usr/bin/who|awk '{print $1}'|xargs)
LOAD=$(uptime|awk -F"load average:" '{print $2}'|awk -F, '{print $3}'|sed 's/ *//')
Memtotal=$(free |sed -n "2p"|awk '{print $2}')
Memuser=$(free |sed -n "3p"|awk '{print $3}')
MEM=$(awk 'BEGIN {x='$Memuser';y='$Memtotal';printf "%.2f\n",(x/y)*100}')
Swaptotal=$(free |sed -n "4p"|awk '{print $2}')
Swapuser=$(free |sed -n "4p"|awk '{print $3}')
SWAP=$(awk 'BEGIN {x='$Swapuser';y='$Swaptotal';printf "%.2f\n",(x/y)*100}')
Cpud=$(/usr/local/bin/iostat -c 1 2|awk 'NR==7 {print $6}')
CPUD=$(awk 'BEGIN {i='$Cpud';printf "%.2f\n",100-i}')
IOSTATE=`/usr/local/bin/iostat -x 1 1|awk '{if ($1 ~/^sd/) print $1,$2"%"}'|xargs`
DISK=$(df|sed -e '1d;s/\/dev\///g'|awk '{printf "%s:%s\n",$1,$5}'|xargs)
OUTFILE=$LogDir/capstats$DATE.log

#将相关信息保存至OUTFILE中
echo ">>>>[$IP] $TIME
用户:$USER
负载:$LOAD
使用内存:$MEM%
使用Swap:$SWAP%
使用 CPU:$CPUD%
硬盘IO:$IOSTATE
硬盘空间:$DISK
-----------------------<<<<" >> $OUTFILE
}
#检测CPU
TEST_CPU()
{
CpuTest=$(echo "$CPUD>=$PoleCpu"|bc)
if [ $CpuTest -eq 1 ];then
    message="当前CPU使用率达$CPUD%,超过指标$PoleCpu%--$curr_date"
    echo $message >> $LogDir/errlog
    echo $message
    SEND_SMS
fi
}

#检测内存
TEST_MEM()
{
MemTest=$(echo "$MEM>=$PoleMem"|bc)
if [ $MemTest -eq 1 ];then
    message="当前内存使用率达$MEM%,超过指标$PoleMem%--$curr_date"
    echo $message >> $LogDir/errlog
    echo $message
    SEND_SMS
fi
}

#检测负载
TEST_LOAD()
{
LadTest=$(echo "$LOAD>=$PoleLad"|bc)
if [ $LadTest -eq 1 ];then
    message="15分钟平均负载为$LOAD,超过指标$PoleLad--$curr_date"
    echo $message >> $LogDir/errlog
    echo $message
    SEND_SMS
fi
}

#检测硬盘空间
TEST_DISK()
{
DiskUse=$(df|sed -e '1d;s/%//g'|awk '{print $5}'|xargs)
for Dfree in $DiskUse ; do
    if [ "$Dfree" -ge "$PoleIde" ];then
        message="硬盘使用空间超过指标$PoleIde%--$curr_date"
        echo $message >> $LogDir/errlog
        echo $message
        SEND_SMS
        break
    fi
done
}

#检测硬盘IO状态
TEST_IO()
{
DiskUseIO=`/usr/local/bin/iostat -x 1 1|awk '{if ($1 ~/^sd/) print $2}'`
for DiskIO in $DiskUseIO ; do
    echo $DiskIO
    DiskIoTest=$(echo "$DiskIO>=$PoleHOI"|bc)
        echo $message >> $LogDir/errlog
        echo $message
        SEND_SMS
        break
    fi
done
}
   
#检查程序状态
TEST_EXE()
{
for exe in $EXE ; do
    echo "开始检测$exe进程"
    exetest=$(ps -ef|grep $exe|grep -v grep|awk '{print$NF}')
    #echo $exetest
    echo "$exetest 进程当前心跳正常$curr_date" >>$LogDir/oracle.log
    if [ -z "$exetest" ] ; then
        message="$exe进程不存在!--$curr_date"
        echo $message >> $LogDir/errlog
        echo $message
        SEND_SMS
        #重启oracle
        sleep 3
        sh /home/oracle/startdb.sh
        sleep 60
        #TEST_EXE
    fi
done
}

SEND_SMS()
{
message1="24服务器告警:"
Message2=$message1$message
echo $message2
for Tel in $TELNO ; do
    mysql -h10.116.21.27 -uinfosms -pinfosms -Dinfosms <<AgentSms
             INSERT INTO smssend02
                   (ServerCode,SmsServerCode,GroupID,PRIORITY,Calling,Called,Payer,OrderDatetime,
                    SendDatetime,EffectStartTime,effectendtime,InvalidDatetime,FeeValue,ifFee,Message,
                    hideflag,MsgType,SmsFeeType,IfsmsReport,ServiceType,MorelatetoMTFlag,Reserve,
                    optempid,optuserid,clientProgramtype,optcode,OPTIP,remark)
             VALUES
                   (2,1,NULL,1,'106558****','$Tel','$Tel',Now(),Now(),'00:00:00','23:59:59','$InvalidDatetime',0,1,'$Message2',NULL,0,1,0,'MYJQF',0,NULL,900005,NULL,5,NULL,'75228999',NULL);
AgentSms
done
}
main()
{
echo "主程序"
run_env
TEST_CPU
TEST_MEM
TEST_LOAD
TEST_DISK
TEST_IO
TEST_EXE
}
main
exit 0

您可能感兴趣的文章:
监控Linux服务器网站状态的SHELL脚本
linux使用curl监控网页的shell脚本
shell脚本监控php-fpm并自动重启服务
监控linux中CPU 内存 磁盘数据的shell脚本(图文)
监控linux服务器性能的shell脚本
执行php脚本的几种办法
检测linux负载过高时重启php的shell脚本
php高级程序员该学什么
一个监控网站运行情况的shell脚本
为什么运维用python

关键词: 性能监控   
[关闭]