perl监控linux系统资源的脚步

来源:互联网 发布:isset php用法 编辑:程序博客网 时间:2024/06/10 13:00
#!/usr/bin/perl -wuse strict;my @MoniterDevideName=("cciss/c0d0p1","cciss/c0d0p3","sda");my @MoniterMountDir=("/");my $MoniterPeriod = 3;my $LogFileDir='./';my $HostName = (map {chomp;$_} (`hostname`))[0];my $LogFileHandle;&MainLoop;sub LogMsg(){my $LogMsg = shift;$LogMsg = &GetLogRecordTime().",".$LogMsg;print $LogFileHandle $LogMsg;}sub MainLoop(){print ("Begin Moniter $HostName\n");my $MoniterTimes = 0;&CheckLogFile();while(1){&MoniterSysResInfo();sleep($MoniterPeriod);$MoniterTimes++; print "\$MoniterTimes:$MoniterTimes \n";if ($MoniterTimes > 1000){&CheckLogFile();$MoniterTimes = 0;}}print ("End Moniter $HostName\n");}sub GetDeviceData(){my $MoniterDeviceName = shift;print $MoniterDeviceName."\n";my $IostatCMDHandle;open $IostatCMDHandle,"iostat  -dkx  $MoniterDeviceName |" or die "cannot fork iostat -x: $!";my $DeviceDataBegin = 0;my $Device="--";my $result = ",-,-,-,-";while(<$IostatCMDHandle>){chomp;s/^\s+//;s/\s+$//;next if ($_ eq "");if($DeviceDataBegin==1){    my @IoStatArray = split /\s+/,$_;my $Size = scalar(@IoStatArray);print "Num items: $Size \n";if (scalar(@IoStatArray) == 1){$Device = $IoStatArray[0];next;}elsif (scalar(@IoStatArray) == 11){my ($RkBs,$WkBs,$AWait,$Svctm,$util) = (split /\s+/,$_)[4,5,8,9,10];my $IOkBS=$RkBs+$WkBs;print "$Device,$IOkBS,$AWait,$Svctm,$util\n";$result = ",$IOkBS,$AWait,$Svctm,$util";return $result;}elsif (scalar(@IoStatArray) == 12){my ($Device,$RkBs,$WkBs,$AWait,$Svctm,$util) = (split /\s+/,$_)[0,5,6,9,10,11];my $IOkBS=$RkBs+$WkBs;print "$Device,$IOkBS,$AWait,$Svctm,$util\n";$result = ",$IOkBS,$AWait,$Svctm,$util";return $result;}elsif (scalar(@IoStatArray) == 14){my ($Device,$RkBs,$WkBs,$AWait,$Svctm,$util) = (split /\s+/,$_)[0,5,6,9,12,13];my $IOkBS=$RkBs+$WkBs;print "$Device,$IOkBS,$AWait,$Svctm,$util\n";$result = ",$IOkBS,$AWait,$Svctm,$util";return $result;}}if(/^Device:/){$DeviceDataBegin = 1;        }}return $result;}sub GetMountFSInfo(){my $MountDir = shift;my $CMD = "df  -m  $MountDir |grep $MountDir | awk '{print \$4/1024,\$5}'";my $result = (map {chomp; s#\s+#,#g;$_} (`$CMD`))[0];return $result;}sub CheckLogFile(){my $LogFile = &GetLogFileName();print "\$LogFile:$LogFile\n";if (-f $LogFile){my @StatLogFile = stat ($LogFile);my $Logfilesize = $StatLogFile[7]/1024/1024; print "LogFile Size: $Logfilesize \n";if ($Logfilesize>50){my $NewLogFilename=$LogFile."_".&GetLogRecordTime();print "\$NewLogFilename : $NewLogFilename \n";`mv $LogFile $NewLogFilename`;}else{return;}}open ($LogFileHandle,">>",$LogFile) or die "can't create logfile:$LogFile, for:$?";print $LogFileHandle ("Time,CPULoadAverage,CPUUtil(%),CPUIOWait(%),MemFree(%)");my $Item;my $DeviceName;foreach $Item (@MoniterDevideName){$DeviceName = $Item."-";print $LogFileHandle (",".$DeviceName."kB/s,",$DeviceName."Await,",$DeviceName."Svctm,",$DeviceName."Util");}my $MountDir;foreach $Item (@MoniterMountDir){$MountDir = $Item."-";print $LogFileHandle (",".$MountDir."Total(GB),",$MountDir."Available(GB)");}print  $LogFileHandle "\n";}sub MoniterSysResInfo(){my $Split = ",";my $OutPut = $HostName.$Split.&GetTopCmdInfo().$Split.&GetMemFree();my $DeviceName;foreach $DeviceName (@MoniterDevideName){$OutPut .= &GetDeviceData($DeviceName); }my $MountDir;foreach $MountDir (@MoniterMountDir){$OutPut .= &GetMountFSInfo($MountDir); }&LogMsg("$OutPut\n");};sub GetTopCmdInfo(){my $CpuUtilResult = "--";my $CpuLoadResult = "--";my $CpuIOWaitResult= "--";my @TopResult = `top -b -n 1 | head -5 `;my $TopLine1 = $TopResult[0];my $TopLine3 = $TopResult[2];chomp $TopLine3;chomp $TopLine1;if ($TopLine1 =~ /\s+load average:\s*(\S+),/){$CpuLoadResult = $1;}if ($TopLine3 =~ /\s+(\S+)%id,\s+(\S+)%wa,\s+/){$CpuUtilResult = 100-$1;$CpuIOWaitResult = $2;}return $CpuLoadResult.",".$CpuUtilResult.",".$CpuIOWaitResult;}sub GetMemFree(){my $Result = `free | grep buffers/cache | awk '{print \$4*100/(\$4+\$3)}'`;chomp $Result;return $Result;}sub GetLogRecordTime(){my $Result = `date +%m_%d_%H_%M_%S`;chomp $Result;return $Result;}sub GetLogFileName(){my $Result = `date +%Y%m%d`;chomp $Result;my $LogFile = $HostName."_".$Result."_Moniter.csv";return $LogFileDir.$LogFile;}

原创粉丝点击