diff options
author | Subhendu Ghosh <sghosh@users.sourceforge.net> | 2002-11-18 21:58:58 +0000 |
---|---|---|
committer | Subhendu Ghosh <sghosh@users.sourceforge.net> | 2002-11-18 21:58:58 +0000 |
commit | e799d3f2549e808a6a96dc41a6dac783aef648c2 (patch) | |
tree | 1fa0577136c77559a2f88dba8aeea0bd6282036c /contrib/check_javaproc.pl | |
parent | 6b2b23058730c44fea2e802076ff65388860c94a (diff) | |
download | monitoring-plugins-e799d3f2549e808a6a96dc41a6dac783aef648c2.tar.gz |
javaproc, sendim
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@211 f882894a-f735-0410-b71e-b25c423dba1c
Diffstat (limited to 'contrib/check_javaproc.pl')
-rw-r--r-- | contrib/check_javaproc.pl | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/contrib/check_javaproc.pl b/contrib/check_javaproc.pl new file mode 100644 index 00000000..a9b52bc9 --- /dev/null +++ b/contrib/check_javaproc.pl @@ -0,0 +1,278 @@ +#!/usr/bin/perl -w + +# +# Author: Wim Rijnders, 17-10-2002 +# +# Description: +# ----------- +# +# Nagios host script to check if any specified java processes are running. +# +# Implementation Notes: +# --------------------- +# +# check_disk_smb was used as a starting point, since it was written in perl. +# +# This script has been created and tested on Linux RH 7.1. +# +# I tried OS-X Darwin (BSD), but the ps command works differently. +# Notably, you can't get a combined list of child processes. The best approach +# appears to be to use 'ps -wwaxo command' combined with 'ps -M' (or suchlike) +# +######################################################################## +#### + +require 5.004; +use POSIX; +use strict; +use Getopt::Long; +use vars qw($opt_w $opt_c $verbose $classname); +use vars qw($PROGNAME); +use lib "utils.pm" ; +use utils qw($TIMEOUT %ERRORS &print_revision &support &usage); + +$PROGNAME="check_javaprocs"; +sub getJavaList (); +sub check_ranges ($ $ $ $); + +Getopt::Long::Configure('bundling', 'no_ignore_case'); +GetOptions + ("V|version" => \&version, + "h|help" => \&help, + "v|verbose" => \$verbose, + "w|warning=s" => \$opt_w, + "c|critical=s" => \$opt_c, + "n|name=s" => \$classname + ); + + +my $state = 'OK'; +my $min_warn = undef +my $max_warn = undef; +my $min_crit = undef; +my $max_crit = undef; + + +($opt_w) || ($opt_w = shift); +check_ranges($opt_w,\$min_warn, \$max_warn, "warning"); +($opt_c) || ($opt_c = shift); +check_ranges($opt_c,\$min_crit, \$max_crit, "critical"); + + +# +# Determine # of running processes for the java programs that interest us. +# +my @javalist = getJavaList(); + +my $total = 0; +my $msgout = ""; +my @fields; + +if ( defined $classname ) { + + #filter out a single java process based on class name + foreach (@javalist) { + @fields = split(/\s+/, $_); + $total = $fields[-1] and last if $classname eq $fields[0]; + } + $msgout .= "$total processes for $classname\n"; +} else { + #Handle all java processes + $msgout .= "\n"; + foreach (@javalist) { + @fields = split(/\s+/, $_); + + $total += $fields[-1]; + $msgout .= " $fields[-1] processes for "; + $msgout .= (scalar @fields > 1)? $fields[0] : "unknown" ; + $msgout .= "\n"; + } + my $msgtotal = "$total java processes for ". scalar @javalist . " applications"; + + if ( defined $verbose ) { + $msgout = $msgtotal . $msgout; + } else { + $msgout = $msgtotal; + } + +} + +# +# Set the state with the data we now have accumulated +# Note that due to the order of testing, warnings have precedence over +# criticals. This is logical, since you should be able to create a criticals +# range which encompasses a warning range. eg. following should be possible: +# +# check_javaproc -w 5:10 -c 3:12 +# proper specification of the ranges is the responsibility of the script user. +# +$state = 'CRITICAL' if (defined $min_crit && $total < $min_crit); +$state = 'CRITICAL' if (defined $max_crit && $total > $max_crit); +$state = 'CRITICAL' if (!defined $min_crit && !defined $max_crit && $total==0 ); +$state = 'WARNING' if (defined $min_warn && $total < $min_warn); +$state = 'WARNING' if (defined $max_warn && $total > $max_warn); + +print $msgout; +print "$state\n" if ($verbose); +exit $ERRORS{$state}; + +################################### +# Support routines for Nagios +################################### +sub check_ranges($$$$) { + my ($opt, $min, $max, $rangename) = @_; + + if ( defined $opt ) { + if ( $opt =~ /^([0-9]*)\:([0-9]*)$/) { + $$min = $1 if $1 > 0; + $$max= $2 if $2 > 0; + } else { + usage("Invalid $rangename range: $opt\n"); + } + } + + if ( defined $$min && defined $$max ) { + usage("Min value of $rangename range larger than max value: $opt\n") if ( $$min > $$max); + } +} + +sub print_usage () { + print "Usage: $PROGNAME [-v] [-w <min:max>] [-c <min:max>] [ -n <classname>]\n"; +} + +sub print_help () { + revision(); + print "Copyright (c) 2002 by Wim Rijnders + +Perl Check java processes plugin for Nagios + +"; + print_usage(); + print " +-v, --verbose + Return additional information. + Intended as a command-line aid, not recommended for Nagios script usage. + +-w, --warning=INTEGER:INTEGER + Minimum and maximum number of processes outside of which a warning will be + generated. If omitted, no warning is generated. + +-c, --critical=INTEGER:INTEGER + Minimum and maximum number of processes outside of which a critical will be + generated. If omitted, a critical is generated if no processes are running. + +-n, --name=STRING + Name of class specified on the java command line (from which main() is run). + If omitted, all java processes are taken into account. + +"; + support(); +} + +sub revision() { + print_revision($PROGNAME,'$Revision$ '); +} + +sub version () { + revision(); + exit $ERRORS{'OK'}; +} + +sub help () { + print_help(); + exit $ERRORS{'OK'}; +} + +################################### +# Routines for delivering the data +################################### + +# +# Generate a formatted list of running java processes. +# +# Returns an array of strings having the following syntax: +# +# <java class running as main> <parameters if any> <#processes for this class> +# +sub getJavaList() { + + my @output; + + # Untaint + local $ENV{'PATH'} = '/bin:/usr/bin'; + local $ENV{'BASH_ENV'} = '~/.bashrc'; + + # We are only interested in the full command line + # The -H opstion is important for the order of the processes; + # this option ensures that all child processes are listed under + # their parents + @output=`ps -AHo \"\%a\" -ww`; + + #remove preceding whitespace and final EOL + foreach (@output) { + s/^\s*//; + chop; + } + + #Combine any consecutive processes with exactly the same command line + #into a single item + @output = checkSameLine(@output); + + #Filter out all java processes + my @javalist; + for (my $i = 0; $i < scalar @output; ++$i) { + push @javalist, $output[$i] if $output[$i] =~ /^\S*java/; + } + + foreach (@javalist) { + #The java statement at the beginning is redundant; remove it + s/^\S*java//; + + #remove all defines + s/\-D\S+//g; + + #remove classpath + s/\-(classpath|cp)\s+\S+//g; + + #remove any other parameters we don't want to see + s/\-server\s+//g; + s/\-X\S*\s+//g; + + #remove any redundant whitespaces at the beginning + s/^\s+//; + + } + + @javalist; +} + + +# +# Combine all consecutive lines with an identical command line +# to a signle line with a count at the end +# +sub checkSameLine { + my @input = @_; + my @output; + my $prevline= ""; + my $prevcount = 0; + + foreach my $a (@input) { + if ( $prevline eq $a) { + ++$prevcount; + } else { + push @output, $prevline . " " . ($prevcount + 1); + $prevcount = 0; + } + $prevline = $a; + } + + #don't forget the last item! + if ( $prevcount > 0 ) { + push @output, $prevline . " " . ($prevcount + 1); + } + + @output; +} + +#======= end check_javaproc ===== |