#!/usr/bin/perl -w
##
## Brian T. Hunter
## 03/18/2023
## Script to check HEALTH OF Server
## Updated .profile in linux to execute script when user login in.
##
use strict;
use warnings;
while(1) {
system("clear");
my $DEBUG="0";
my $cmd_vmstat=`/usr/bin/vmstat 2 2 | tail -1`;
chomp($cmd_vmstat);
my $log_vmstat="/tmp/vmstat_out.txt";
unlink $log_vmstat if($log_vmstat);
open(OUT,">>$log_vmstat") or die ("Unable to write to file $log_vmstat$!\n");
print OUT "$cmd_vmstat\n";
my $ostype=`/bin/uname -a | cut -d' ' -f1`; chomp($ostype);
my($r,$b,$swpd,$free,$buff,$cache,$si,$so,$bi,$bo,$in,$cs,$us,$sy,$id,$wa,$st);
print "===========================================================================================\n\n";
my $MyDate=`date`;
chomp($MyDate);
print "\t\t\t$MyDate\n";
my $Hostname=`hostname`;
chomp($Hostname);
print "\t\t\t$Hostname\n";
print "\t\t\tOperating System is $ostype\n";
my $kernel=`uname -r`;
print "\t\t\tKernel Version is $kernel\n";
open(OUT, "<$log_vmstat") or warn "Unable to open $log_vmstat :$!\n";
while() {
print "BEFORE LINE: $_\n" if($DEBUG eq '1');
$_ =~ s/^ *//g;
$_ =~ s/ */:/g;
print "AFTER LINE: $_\n" if($DEBUG eq '1');
($r,$b,$swpd,$free,$buff,$cache,,$si,$so,$bi,$bo,$in,$cs,$us,$sy,$id,$wa,$st) = split(/:/,$_);
print "r=$r\n" if($DEBUG eq '1');
print "b=$b\n" if($DEBUG eq '1');
print "swpd=$swpd\n" if($DEBUG eq '1');
print "free=$free\n" if($DEBUG eq '1');
print "buff=$buff\n" if($DEBUG eq '1');
print "cache=$cache\n" if($DEBUG eq '1');
print "si=$si\n" if($DEBUG eq '1');
print "so=$so\n" if($DEBUG eq '1');
print "bi=$bi\n" if($DEBUG eq '1');
print "bo=$bo\n" if($DEBUG eq '1');
print "in=$in\n" if($DEBUG eq '1');
print "cs=$cs\n" if($DEBUG eq '1');
print "us=$us\n" if($DEBUG eq '1');
print "sy=$sy\n" if($DEBUG eq '1');
print "id=$id\n" if($DEBUG eq '1');
print "wa=$wa\n" if($DEBUG eq '1');
print "st=$st\n" if($DEBUG eq '1');
}
close(OUT);
print "===========================================================================================\n\n";
my @Partitions=`df -h | grep -v loop | grep ^\/dev`;
print "PARTITIONS = @Partitions\n" if($DEBUG eq '1');
foreach my $part (@Partitions) {
my($device,$size,$used,$free,$DiskPercent,$DiskName) = split(/ */,$part);
chomp($DiskPercent);
chomp($DiskName);
print "DEVICE=$device\n" if($DEBUG eq '1');
print "SIZE=$size\n" if($DEBUG eq '1');
print "USED=$used\n" if($DEBUG eq '1');
print "FREE=$free\n" if($DEBUG eq '1');
print "DiskPercent=$DiskPercent\n" if($DEBUG eq '1');
print "DiskName=$DiskName\n" if($DEBUG eq '1');
my($DiskTotal,$sign) = split(/%/,$DiskPercent);
if($DiskTotal < "80") {
print "PARTITION USUAGE PERCENTAGE.....................................................OK: [$DiskName] $DiskPercent \n";
} else {
print "PARTITION USUAGE PERCENTAGE.............................................ALERT: [$DiskName] $DiskPercent \n";
}
}#foreach{}
if($r < "100") {
print "NUMBER OF RUNNABLE PROCESSES....................................................OK: $r \n";
} else {
print "NUMBER OF RUNNABLE PROCESSES.................................................ALERT: $r \n";
}
if($b < "100") {
print "NUMBER OF PROCESSES UNINTERRUPTIBLE SLEEP.......................................OK: $b \n";
} else {
print "NUMBER OF PROCESSES UNINTERRUPTIBLE SLEEP....................................ALERT: $b \n";
}
my $SwapTotal=`cat /proc/meminfo | grep ^SwapTotal | cut -d: -f2 | awk -F'kB' '{print \$1}'`; chomp($SwapTotal);
$SwapTotal =~ s/^ *//g;
print "SWapTotal $SwapTotal\n" if($DEBUG eq '1');
my $SwapFree=`cat /proc/meminfo | grep ^SwapFree | cut -d: -f2 | awk -F'kB' '{print \$1}'`; chomp($SwapFree);
$SwapFree =~ s/^ *//g;
print "SWapFree $SwapFree\n" if($DEBUG eq '1');
my $SwapPercent=($SwapTotal * .80); # Test for 80% or highter
print "SwapPercent $SwapPercent\n" if($DEBUG eq '1');
if($SwapFree >= $SwapPercent) {
print "AMOUNT OF SWAP MEMORY FREE......................................................OK: $SwapFree \n";
} else {
print "AMOUNT OF SWAP MEMORY FREE...................................................ALERT: $SwapFree \n";
}
my $MemTotal=`cat /proc/meminfo | grep ^MemTotal | cut -d: -f2 | awk -F'kB' '{print \$1}'`; chomp($MemTotal);
$MemTotal =~ s/^ *//g;
print "MemTotal: $MemTotal\n" if($DEBUG eq '1');
my $MemFree=`cat /proc/meminfo | grep ^MemFree | cut -d: -f2 | awk -F'kB' '{print \$1}'`; chomp($MemFree);
$MemFree =~ s/^ *//g;
print "MemFree $MemFree\n" if($DEBUG eq '1');
my $MemAvailable=`cat /proc/meminfo | grep ^MemAvail | cut -d: -f2 | awk -F'kB' '{print \$1}'`; chomp($MemAvailable);
$MemAvailable =~ s/^ *//g;
print "MemAvailable $MemAvailable\n" if($DEBUG eq '1');
my $MemPercent=($MemTotal * .20); # Test for 80% or highter, the smaller the value the ALERT.
print "MemPercent: $MemPercent\n" if($DEBUG eq '1');
if( $MemAvailable >= $MemPercent ) {
print "AMOUNT OF MEMORY FREE...........................................................OK: $MemAvailable \n";
} else {
print "AMOUNT OF MEMORY FREE.........................................................ALERT $MemAvailable \n";
}
if($si < "100") {
print "AMOUNT OF MEMORY SWAPPED IN FROM DISK...........................................OK: $si \n";
} else {
print "AMOUNT OF MEMORY SWAPPED IN FROM DISK.........................................ALERT $si \n";
}
if($so < "100") {
print "AMOUNT OF MEMORY SWAPPED TO DISK................................................OK: $so \n";
} else {
print "AMOUNT OF MEMORY SWAPPED TO DISK..............................................ALERT $so \n";
}
if($bi < "100") {
print "BLOCKS RECEIVED FROM A BLOCK DEVICE PER SECONDS.................................OK: $bi \n";
} else {
print "BLOCKS RECEIVED FROM A BLOCK DEVICE PER SECONDS..............................ALERT: $bi \n";
}
if($bo <= "100") {
print "BLOCKS SENT TO A BLOCK DEVICE PER SECONDS.......................................OK: $bo \n";
} else {
print "BLOCKS SENT TO A BLOCK DEVICE PER SECONDS....................................ALERT: $bo \n";
}
if($in <= "500") {
print "NUMBER OF INTERRUPTS PER SCONDS.................................................OK: $in \n";
} else {
print "NUMBER OF INTERRUPTS PER SCONDS..............................................ALERT: $in \n";
}
if($cs <= "2000") {
print "NUMBER OF CONTEXT SWITCHES PER SCONDS...........................................OK: $cs \n";
} else {
print "NUMBER OF CONTEXT SWITCHES PER SCONDS........................................ALERT: $cs \n";
}
if($us <= "85") {
print "CPU USER USUAGE.................................................................OK: $us \n";
} else {
print "CPU USER USUAGE...............................................................ALERT $us \n";
}
if($sy <= "85") {
print "CPU SYSTEM USUAGE...............................................................OK: $sy \n";
} else {
print "CPU SYSTEM USUAGE.............................................................ALERT $sy \n";
}
if($id >= "20") {
print "CPU IDLE USUAGE.................................................................OK: $id \n";
} else {
print "CPU IDLE USUAGE...............................................................ALERT $id \n";
}
if($wa <= "30") {
print "CPU WAITING FOR I/O USUAGE......................................................OK: $wa \n";
} else {
print "CPU WAITING FOR I/O USUAGE...................................................ALERT: $wa \n";
}
if($st <= "30") {
print "CPU TIME STOLEN FROM VIRTUAL MACHINE USUAGE.....................................OK: $st \n";
} else {
print "CPU TIME STOLEN FROM VIRTUAL MACHINE USUAGE..................................ALERT: $st \n";
}
print "===========================================================================================\n";
system("sleep 5");
exit(0);
}
exit(0);