本节内容:
一例监控linux 服务器性能的shell/ target=_blank class=infotextkey>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.jb200.com
#需要安装包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 "%.2fn",(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 "%.2fn",(x/y)*100}')
Cpud=$(/usr/local/bin/iostat -c 1 2|awk 'NR==7 {print $6}')
CPUD=$(awk 'BEGIN {i='$Cpud';printf "%.2fn",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:%sn",$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