linux监测服务日志脚本,LINUX下的一个性能监测脚本
#!/usr/bin/perl -w
#use Fcntl qw(:flock);
use strict;
use Mail::Sender;
use Sys::Statistics::Linux;
use Fetion;
my $cpu_max=90; #cpu最大占用率
my $mem_free_mix=10; #最小可用内才能
my $disk_free_mix=50; #最小可用磁盘空间
my $max_io=1; #最大的io wait队列
#my $max_send_times=2;
#my $match_count=0;
my %opt=(sysinfo => 0,
cpustats => 1,
procstats => 0,
memstats => 1,
pgswstats =>0,
netstats => 0,
sockstats => 1,
diskstats => 0,
diskusage => 1,
loadavg => 1,
filestats => 1,
processes => 0,
);
my $lxs = Sys::Statistics::Linux->new(\%opt);
my $cad_check_time=(localtime)[2]; #cad mean cpu and ddram
my $io_check_time=$cad_check_time;
my $disk_usage_check_time=$cad_check_time;
my $warn_flag=0;
my $pre_flag=0;
my $pre_io_check=0;
my $cur_io_flag=0;
my $pre_space_flag=0;
my $cur_space_flag=0;
my $small_space={{},1};
my @space;
my $counter=1;
#print STDOUT Dumper($small_space),"\n";
my $stat;
my @iostat;
while(sleep 2){
my ($cad_flag,$space_flag,$io_flag)=(0,0,0);
$stat = $lxs->get;
@iostat=split /\s/,(`vmstat`)[2]; #这句为后面的IO检查做准备
#如果cpu的占用率大于90%,或者内存占用达到90%,并且平均负载大于5,发送警报邮件和短信通知,这个部分还需要改良,最好进一步分开内存和cpu,因为内存占用很高,负载不一定高的
#--------------------检查cpu和内存的使用情况-------------------
if($stat->cpustats->{cpu}->{total}>$cpu_max||($stat->memstats->{memfree}+$stat->memstats->{buffers}+$stat->memstats->{cached})/$stat->memstats->{memtotal}*100
{
if($stat->loadavg->{avg_1}>2)
{
$pre_flag=$warn_flag;
$warn_flag=1; #警报标志
if($pre_flag==1) #为1时,证明之前出现过警报的情况
{
if((localtime)[2]!=$cad_check_time) #检查是否在同一时段出现警报,默认时间间隔为1小时,同一时段内,只发送一次短信和邮件
{
print 'send when cpu&&ram busy and time !=',"\n";
#&sendMail('loadavg is too hight',$stat->cpustats->{cpu}->{total},($stat->memstats->{memfree}+$stat->memstats->{buffers}+$stat->memstats->{cached})/$stat->memstats->{memtotal}*100,$stat->loadavg->{avg_1});#sendMail(subject,cpu_usage,ram_free,loadavg)
&sendMail(1); #1 mean cpu&&ram
&sendSms(1,'your phone number','you passwd');
$cad_check_time=(localtime)[2]; #更新最近一次的警报时间
}
}
else
{
#初次发送
print 'send when flag=0, that is the first time',"\n";
#&sendMail('loadavg is too hight',$stat->cpustats->{cpu}->{total},($stat->memstats->{memfree}+$stat->memstats->{buffers}+$stat->memstats->{cached})/$stat->memstats->{memtotal}*100,$stat->loadavg->{avg_1});#sendMail(subject,cpu_usage,ram_free,loadavg)
&sendMail(1);
&sendSms(1,'your phone number','you passwd');
}
$cad_flag=1;
}
else
{
$pre_flag=0;
$cad_flag=0;
}
}
#---------------------------cpu&&内存检查完毕------------------------
#-------------------------------------------------------
#----------------检查磁盘空间-----------------------------
#这部分还需要改进,如何去进一步的区别容量满的分区
my $driver;
foreach $driver(keys %{$stat->diskusage})
{
next if $driver!~/^\/dev\//;
#print $driver,"\n";
my $drive=$driver;
#print $drive,"\n";
$driver=~s/\/dev\///gi;
#print $driver,"\n";
#print $drive,"\n";
if($stat->diskusage->{$drive}->{usage}/$stat->diskusage->{$drive}->{total}*100>$disk_free_mix)
{
if(!exists $small_space->{$driver}) #设备是否重复,重复的跳过
{
$small_space->{$driver}->{check_time}=(localtime)[2]; #记录出现警报的时间
$small_space->{$driver}->{space_flag}=1; #0 mean had checked before,1 not before
$small_space->{$driver}->{free}=sprintf "%.2f",$stat->diskusage->{$drive}->{free}/$stat->diskusage->{$drive}->{total}*100; #容量取两位小数
print "send when the first time that $driver space is hardly full","\n";
#&sendMail(2);
}
$space_flag=1;
}
else
{
if(exists $small_space->{$driver})
{
delete $small_space->{$driver}
}
$space_flag=0;
}
}
if((keys %{$small_space})>1) #排除本来的没用HASH
{
if($counter==1)
{
&sendMail(2);
&sendSms(2,'your phone number','you passwd');
$counter=2;
}
else
{
foreach $driver(keys %{$small_space})
{
next if $driver=~/^HASH/;
if($small_space->{$driver}->{space_flag}==1)
{
if($small_space->{$driver}->{check_time}!=(localtime)[2]) #检查是否为同一时段,相同的跳过,避免重复发信,默认为1小时
{
print 'send when someone disk space is fulland time !=',"\n";
$small_space->{$driver}->{check_time}=(localtime)[2]; #更新时间点
&sendMail(2);
&sendSms(2,'your phone number','you passwd');
}
}
}
}
}
#----------检查磁盘空间结束-----------------
#-----------检查磁盘io操作-----------------
#@iostat=split /\s/,(`vmstat`)[2]; #要求有vmstat这个脚本,在/proc里边
if($iostat[-1]>$max_io)
{
$pre_io_check=$cur_io_flag;
$cur_io_flag=1;
if($pre_io_check==1)
{
if((localtime)[2]!=$io_check_time)
{
print 'send when io busy and time !=',"\n";
$io_check_time=(localtime)[2];
&sendMail(3);
&sendSms(3,'your phone number','you passwd');
}
}
else
{
print 'send when pre_io_check=0, that is the first time',"\n";
&sendMail(3);
&sendSms(3,'your phone number','you passwd');
}
$io_flag=1;
}
else
{
$io_flag=0;
}
#---------------------检查磁盘IO结束-----------------
&writeLog($cad_flag,$space_flag,$io_flag); #无论遇到什么警报,都记录在日志上
} #主循环结束
#---------------------------函数部分------------------------------
#----------------------writeLog fun----------------------------------------------
sub writeLog{
#use Data::Dumper;
my ($cad_flag,$space_flag,$io_flag)=@_;
if($cad_flag||$space_flag||$io_flag)
{
my $time=localtime;
my $log_file='log.txt';
open LOG,">>",$log_file||die "can't open $log_file for write:$!\n";
#if(flock LOG,LOCK_EX)#||die "can't lock $log_file:$!\n";
#{
# print STDERR "ok\n";
#}
#select LOG;
#time cpu_usage% loadavg ram_free% disk_space_free% io_wait tcp
# 10 0 73 sda1:10,sda2:5,sda3:11 1 6
#if($cad_flag||$space_flag||$io_flag)
#{
#print "$time $stat->cpustats->{cpu}->{total} $stat->loadavg->{avg_1} ",$stat->memstats->{memfree}+$stat->memstats->{buffers}+$stat->memstats->{cached})/$stat->memstats->{memtotal}*100,$stat->diskusage->{$drive}->{free}/$stat->diskusage->{$drive}->{total}*100," $iostat[-1] $stat->sockstats->{tcp}\n";
#printf("%s %d %d %d %s %d\n",$time,$stat->cpustats->{cpu}->{total},$stat->loadavg->{avg_1},($stat->memstats->{memfree}+$stat->memstats->{buffers}+$stat->memstats->{cached})/$stat->memstats->{memtotal}*100,$iostat[-1],$stat->sockstats->{tcp});
foreach my $dev(keys %{$small_space}) #因为日之中磁盘空间那里比较特别,所以要特殊处理;将整个字段作为一个数组处理,待会儿可以进行join
{
next if $dev=~/^HASH/;
push @space,"$dev:$small_space->{$dev}->{free}";
}
printf LOG ("%s %.2f %.2f %.2f %s %s %d\n",$time,$stat->cpustats->{cpu}->{total},$stat->loadavg->{avg_1},($stat->memstats->{memfree}+$stat->memstats->{buffers}+$stat->memstats->{cached})/$stat->memstats->{memtotal}*100),join(",",@space),$iostat[-1],$stat->sockstats->{tcp};
#}
#select STDOUT;
#flock(LOG,LOCK_UN)||die "can't unlock $log_file:$!\n";
@space=();
close LOG;
}
}
#------------------------writeLog end ------------------------------
#---------------------sendSms fun-----------------------------------
sub sendSms{
my ($warn_type,$num,$passwd,$to_num)=@_;
#my $sms='cpu usage:'.$stat->cpustats->{cpu}->{total}.'% freemem:'.sprintf("%.2f",($stat->memstats->{memfree}+$stat->memstats->{buffers}+$stat->memstats->{cached})/$stat->memstats->{memtotal}*100).'% system loadavg:'.$stat->loadavg->{avg_1}.'% IO wait:'.$iostat[-1].' TCP:'.$stat->sockstats->{tcp};
my $sms;
if($warn_type==1)
{
$sms='warning:Loadavg is too high.'.'cpu usage:'.$stat->cpustats->{cpu}->{total}.'% freemem:'.sprintf("%.2f",($stat->memstats->{memfree}+$stat->memstats->{buffers}+$stat->memstats->{cached})/$stat->memstats->{memtotal}*100).'% system loadavg:'.$stat->loadavg->{avg_1}.'% IO wait:'.$iostat[-1].' TCP:'.$stat->sockstats->{tcp};
}
elsif($warn_type==2)
{
$sms='warning:Disk space is full.'.'cpu usage:'.$stat->cpustats->{cpu}->{total}.'% freemem:'.sprintf("%.2f",($stat->memstats->{memfree}+$stat->memstats->{buffers}+$stat->memstats->{cached})/$stat->memstats->{memtotal}*100).'% system loadavg:'.$stat->loadavg->{avg_1}.'% IO wait:'.$iostat[-1].' TCP:'.$stat->sockstats->{tcp};
}
else
{
$sms='warning:Disk io are busy.'.'cpu usage:'.$stat->cpustats->{cpu}->{total}.'% freemem:'.sprintf("%.2f",($stat->memstats->{memfree}+$stat->memstats->{buffers}+$stat->memstats->{cached})/$stat->memstats->{memtotal}*100).'% system loadavg:'.$stat->loadavg->{avg_1}.'% IO wait:'.$iostat[-1].' TCP:'.$stat->sockstats->{tcp};
}
print "init..", Fetion::fx_init(), "\n";
if(Fetion::fs_login($num , $passwd ))#|| die " cannot login , try again please\n";
{#print "get account", Dumper( Fetion::fx_get_account() ), "\n";
print "send to self......";
Fetion::fs_send_sms_to_self($sms);
print "\n";
#print "send to $to_num..";
#Fetion::fs_send_sms_by_mobile_no($to_num, $sms)||die "can't send:$!\n";
#send to someuser of feixin
#print "send to 440227509", Fetion::fs_send_sms(440227509, "你这个白痴"), "\n";
print "loginout", Fetion::fx_loginout(), "\n";
print "terminate", Fetion::fx_terminate(), "\n";
}
else
{
if(open ERR,">>",'err.log')
{
print ERR "can't send sms,please check the usename&&password again or make sure you internet is available\n";
close ERR;
}
else
{
print "can't open err.log to write:$!\n";
}
print "can't send sms,please check the usename&&password again or make sure you internet is available\n";
return -1;
}
}
#-----------------------sendSms fun end------------------------------
#-----------------------sendMail fun------------------------------------
sub sendMail{
my ($warn_type)=@_;
my $subject;
my $msg='cpu usage:'.$stat->cpustats->{cpu}->{total}.'% freemem:'.sprintf("%.2f",($stat->memstats->{memfree}+$stat->memstats->{buffers}+$stat->memstats->{cached})/$stat->memstats->{memtotal}*100).'% system loadavg:'.$stat->loadavg->{avg_1}.'% IO wait:'.$iostat[-1].' TCP:'.$stat->sockstats->{tcp};
if($warn_type==1)
{
$subject='warning:Loadavg is too high';
#$msg="cpu usage:$stat->cpustats->{cpu}->{total}% ".'freemem:'.($stat->memstats->{memfree}+$stat->memstats->{buffers}+$stat->memstats->{cached})/$stat->memstats->{memtotal}*100.'% system loadavg:'.$stat->loadavg->{avg_1}.'% IO wait:'.$iostat[-1].' TCP:'.$stat->sockstats->{tcp}.' Disk space:'.join(",",@space);
}
elsif($warn_type==2)
{
$subject='warning:Disk space is full';
foreach my $dev(keys %{$small_space}) #因为日之中磁盘空间那里比较特别,所以要特殊处理;将整个字段作为一个数组处理,待会儿可以进行join
{
next if $dev=~/^HASH/;
push @space,"$dev:$small_space->{$dev}->{free}";
}
$msg='cpu usage:'.$stat->cpustats->{cpu}->{total}.'% freemem:'.sprintf("%.2f",($stat->memstats->{memfree}+$stat->memstats->{buffers}+$stat->memstats->{cached})/$stat->memstats->{memtotal}*100).'% system loadavg:'.$stat->loadavg->{avg_1}.'% IO wait:'.$iostat[-1].' TCP:'.$stat->sockstats->{tcp}.' '.join(",",@space);
}
else
{
$subject='warning:Disk io are busy';
}
@space=();
#$msg='cpu usage:'.$stat->cpustats->{cpu}->{total}.'% freemem:'.sprintf("%.2f",($stat->memstats->{memfree}+$stat->memstats->{buffers}+$stat->memstats->{cached})/$stat->memstats->{memtotal}*100).'% system loadavg:'.$stat->loadavg->{avg_1}.'% IO wait:'.$iostat[-1].' TCP:'.$stat->sockstats->{tcp};#.' Disk space:'.join(",",@space);
my $sender;
eval{
$sender=new Mail::Sender();
#my @protocols = $sender->QueryAuthProtocols(); 查询服务器支持的认证方式
if ($sender->MailMsg({
#smtp => 'smtp.163.com',by Default,test@163.com
#from => 'test@163.com', by Default
to =>'test98@163.com',
subject => $subject, #主题
msg => $msg, #内容
auth => 'LOGIN', #smtp的验证方式
authid => 'user', #user
authpwd => 'passwd', #pwd
}) < 0) {
warn "$Mail::Sender::Error\n";
}
print "warning Mail sent OK.\n";
};
if($@)
{
if(open ERR,">>",'err.log')
{
print ERR "$Mail::Sender::Error\n";
close ERR;
}
else
{
print "can't open err.log to write:$!\n";
}
print "can't send mail,please check the err.log for detail\n";
return -1;
}
}
#--------------------sendMail fun end--------------------------------------
linux监测服务日志脚本,LINUX下的一个性能监测脚本相关推荐
- linux smb服务安装包,Linux下如何安装smb服务
Linux下如何安装smb服务 什么是smb服务 smb服务提供一个基本的服务,这个服务很有用哦:作为一个Linux程序员,我们编写.维护.运行的代码都是存放在Linux机器上,但是我们常常阅读修改代 ...
- Linux系统.xsesion日志文件,linux系统日志
##日志记录系统每天发生的各种各样的事情,比如监控系统的状况,排查系统的故障等.你可以通过日志来检查错误发生的原因,或者受到***时留下的痕迹.日志的主要功能是审计和监测,还有实时的监测系统状态,监测 ...
- linux文件服务有哪些,linux有哪些文件系统?_网站服务器运行维护,linux
linux运维学什么知识?_网站服务器运行维护 linux运维需要学的知识:1.Linux基础知识.linux操作系统:2.bash脚本编程:3.文本处理命令:4.数据库:5.防火墙:6.监控工具:7 ...
- linux查看php日志命令,linux查看日志的三种命令是什么,linux查看进程命令
linux查看日志的三种命令是什么Linux查看日志的三个命令是什么,linux查看日志有三个命令:1.查看实时更改日志,代码为[tail-f filename]:2.搜索关键字附近的日志代码为[ca ...
- linux ssh服务状态,查看linux ssh服务信息及运行状态方法
关于ssh服务端配置有不少文章,例如 linux下ssh服务配置,这里仅列举出一些查看ssh服务相关信息的常用命令. 1 安装 apt-get install openssh-server 2 完成后 ...
- linux打印服务叹号,linux中如何通过echo输出!(叹号)? -bash: !: event not found
需求描述: 今天在做通过echo结合passwd给用户改密码的过程中,出现无法修改的错误. 错误如下: [root@testvm ~]# useradd mytest [root@testvm ~]# ...
- linux添加服务命令行,Linux系统自有服务(上)
系统自有服务(上).md Linux系统自有服务 自有服务,即不需要用户独立去安装的软件的服务,而是当系统安装好之后就可以直接使用的服务(内置) 学习目标 1.了解Linux的7种运行模式 2.了解用 ...
- 华为云服务-运维篇-应用健康状况追踪-性能监测
文章目录 前言 性能监测意义 应用性能监控 Java 应用探针 步骤一.登录虚拟机 步骤二 .Java应用启动添加配置项 步骤三. APM 步骤四.应用性能管理 APM 步骤五.查看监控的应用性能管理 ...
- linux定时任务打印日志,Centos7(linux)使用crond服务定时执行js脚本并将脚本的输出内容记录日志文件的简单应用...
- ## 在Centos7.8上使用crond服务定时执行js脚本并将脚本执行的输出记录日志 1. 安装wget 2. wget https://npm.taobao.org/mirrors/node ...
- linux c打印日志文件,linux c下log输出代码模板示例代码
前言 本文主要介绍了关于linux c下log输出代码模板的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 模板 模本分为两个文件:log.c和log.h. log.c /* ...
最新文章
- Halcon模板匹配之读取dxf文件生成xld与后续操作
- How to include custom library into maven local repository?--转
- Java标准流输入输出流In(Out)putStream,ReaderWriter等总结(1)
- 不带头节点的链表有哪些缺点_14. 删除链表中重复的结点
- 畅游互联的API接口如何对接到自己的网站上?
- IMP-00009:异常结束导出文件解决方案
- 男单巅峰战林丹力克索尼 再度封王成功卫冕
- MATLAB 50行代码绘制超好看的旋转九边形
- 如何设置能快速的阅读一本PDF电子书并做笔记?
- java 正则表达式匹配_Java 正则表达式匹配
- 带你认识!通用网络安全开发包(Libdnet)
- NASM汇编教程翻译01 第一讲 Hello, World!
- 均匀白噪声的定义及特点_白噪声深度分析
- 我的新书《C++服务器开发精髓》终于出版啦
- 费马引理、罗尔定理、拉格朗日中值定理、柯西中值定理
- Springboot配置多个数据源
- idea项目列表名称与项目名称不一致
- 【有利可图网】PS实战系列:制作树林与文字结合的创意文字效果
- 基于 Transformer 模型的电影评论情感分类
- 样式的层级关系,选择器优先级,样式冲突,以及抽离样式模块怎么写,说出思路,有无实践经验