thorko Repositories scripts

Compare Revisions

Ignore whitespace Rev 3 → Rev 4

/perl/trunk/v1.0/check_procs2
New file
0,0 → 1,124
#!/usr/bin/perl -w
#
# This Nagios plug-in checks the existence of processes
#
# check_procs2 <process name> <relation> <number> ...
#
# where <relation> can be
# eq equal
# gt greater than
# ge greater equal
# lt less than
# le less equal
#
# Example:
# check_procs2 sendmail gt 2
#
# Michael Hocke, NYU, 6/16/2006
 
use strict;
 
my $ME = substr ("/usr/bin/perl -w $0 " . join (" ", @ARGV), 0, 79);
my $USAGE = "$0: <process name> <relation> <number> [and] ...\n";
 
# parse command line and store rules
my %rules;
 
if ($#ARGV == -1) {
print $USAGE;
exit 3;
}
 
my $parm = 0;
while ($parm <= $#ARGV) {
if ($ARGV[$parm] eq "and") {
if ($parm == 0 or $parm == $#ARGV) {
print "$0: dangling 'and'\n";
exit 3;
}
$parm ++;
} elsif ($ARGV[$parm] eq "or") {
print "$0: 'or' operator not implemented (yet)\n";
exit 3;
} elsif ($parm + 2 > $#ARGV) {
print "$0: incomplete expression\n";
exit 3;
} else {
my ($crit_level, $warn_level) = split /:/, $ARGV[$parm + 2];
$rules{$ARGV[$parm]} = [$ARGV[$parm + 1], $crit_level, $warn_level, 0];
$parm += 3;
}
}
 
# determine the OS
my $cmd;
if ( $^O eq "solaris" ) {
$cmd = "/usr/bin/ps -e -o comm=";
}
if ( $^O eq "linux" ) {
$cmd = "/bin/ps -e -o comm";
}
# get content of process table and match process names
my $proc_no = 0;
open PS, "$cmd |";
my $skip_header = <PS>;
while (<PS>) {
chomp;
$proc_no ++;
next if ($_ eq $ME);
for my $pattern (keys %rules) {
if (/$pattern/) {
#print "MATCH ($pattern) $_";
$rules{$pattern}[3] ++;
}
}
}
close PS;
 
# go through all rules and see if all conditions are met
sub add_result {
my ($met, $rule, $want, $is, $prev_result) = @_;
my $str = "";
if (not $met) {
$str .= ", " if ($prev_result);
$str .= "$rule: $is/$want";
}
return $str;
}
 
my $crit_result = "";
my $warn_result = "";
for my $rule (keys %rules) {
my $op = $rules{$rule}->[0];
my $crit_want = $rules{$rule}->[1];
my $warn_want = $rules{$rule}->[2];
my $is = $rules{$rule}->[3];
if ($op eq "eq") {
$crit_result .= add_result ($is == $crit_want, $rule, $crit_want, $is, $crit_result) if (defined $crit_want);
$warn_result .= add_result ($is == $warn_want, $rule, $warn_want, $is, $warn_result) if (defined $warn_want);
} elsif ($op eq "ge") {
$crit_result .= add_result ($is >= $crit_want, $rule, $crit_want, $is, $crit_result) if (defined $crit_want);
$warn_result .= add_result ($is >= $warn_want, $rule, $warn_want, $is, $warn_result) if (defined $warn_want);
} elsif ($op eq "gt") {
$crit_result .= add_result ($is > $crit_want, $rule, $crit_want, $is, $crit_result) if (defined $crit_want);
$warn_result .= add_result ($is > $warn_want, $rule, $warn_want, $is, $warn_result) if (defined $warn_want);
} elsif ($op eq "le") {
$crit_result .= add_result ($is <= $crit_want, $rule, $crit_want, $is, $crit_result) if (defined $crit_want);
$warn_result .= add_result ($is <= $warn_want, $rule, $warn_want, $is, $warn_result) if (defined $warn_want);
} elsif ($op eq "lt") {
$crit_result .= add_result ($is < $crit_want, $rule, $crit_want, $is, $crit_result) if (defined $crit_want);
$warn_result .= add_result ($is < $warn_want, $rule, $warn_want, $is, $warn_result) if (defined $warn_want);
}
}
 
# return result
if ($crit_result) {
print "PROCS CRITICAL: $proc_no processes - $crit_result\n";
exit 2;
} elsif ($warn_result) {
print "PROCS WARNING: $proc_no processes - $warn_result\n";
exit 1;
} else {
print "PROCS OK: $proc_no processes - no problems found\n";
exit 0;
}
Property changes:
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property