Souped up check_procs with different metrics

git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@474 f882894a-f735-0410-b71e-b25c423dba1c
This commit is contained in:
Ton Voon 2003-04-07 22:53:49 +00:00
parent 8fa5d6d877
commit 1a6c23309c
5 changed files with 306 additions and 472 deletions

View file

@ -622,13 +622,9 @@ dnl STAT UCOMM VSZ RSS USER UID PPID COMMAND
if ps -weo 'stat comm vsz rss user uid ppid args' 2>/dev/null | \
egrep -i ["^ *S[TAUES]* +[UCOMDNA]+ +[VSIZE]+ +R[S]+ +U[SER]+ +U[ID]+ +P[PID]+ +[RGSCOMDNA]+"] >/dev/null
then
ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS -weo 'stat uid ppid comm args'"
ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS -weo 'stat uid ppid vsz rss pcpu comm args'"
ac_cv_ps_format="%s %d %d %s %n"
ac_cv_vsz_command="$PATH_TO_PS -weo 'vsz comm'"
ac_cv_vsz_format="%d %s"
ac_cv_rss_command="$PATH_TO_PS -weo 'rss comm'"
ac_cv_rss_format="%d %s"
EXTRAS="$EXTRAS check_nagios"
AC_MSG_RESULT([$ac_cv_ps_command])
@ -636,13 +632,9 @@ dnl FreeBSD
elif ps waxco 'state command vsz rss uid user ppid' 2>/dev/null | \
egrep -i ["^STAT +COMMAND +VSZ +RSS +UID +USER +PPID"] >/dev/null
then
ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS waxco 'state uid ppid command command'"
ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS waxco 'state uid ppid vsz rss pcpu command command'"
ac_cv_ps_format="%s %d %d %s %n"
ac_cv_vsz_command="$PATH_TO_PS waxco 'vsz command'"
ac_cv_vsz_format="%d %s"
ac_cv_rss_command="$PATH_TO_PS waxco 'rss command'"
ac_cv_rss_format="%d %s"
EXTRAS="$EXTRAS check_nagios"
AC_MSG_RESULT([$ac_cv_ps_command])
@ -650,13 +642,9 @@ dnl BSD-like mode in RH 6.1
elif ps waxno 'state comm vsz rss uid user ppid args' 2>/dev/null | \
egrep -i ["^S +COMMAND +VSZ +RSS +UID +USER +PPID +[RGSCOMDNA]+"] >/dev/null
then
ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS waxno 'state uid ppid comm args'"
ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS waxno 'state uid ppid vsz rss pcpu comm args'"
ac_cv_ps_format="%s %d %d %s %n"
ac_cv_vsz_command="$PATH_TO_PS waxno 'vsz comm'"
ac_cv_vsz_format="%d %s"
ac_cv_rss_command="$PATH_TO_PS waxno 'rss comm'"
ac_cv_rss_format="%d %s"
EXTRAS="$EXTRAS check_nagios"
AC_MSG_RESULT([$ac_cv_ps_command])
@ -665,13 +653,9 @@ dnl F UID PID PPID CP PRI NI SZ RSS WCHAN STAT TT TIME COMMAND
elif ps -laxnwww 2>/dev/null | \
egrep -i ["^ *F(LAGS)? +UID +PID +PPID +CP +PRI +NI +(SZ)|(VSZ)|(SIZE) +RSS +WCHAN +STAT? +TTY? +TIME +COMMAND"] >/dev/null
then
ac_cv_ps_varlist="[&procuid,&procppid,procstat,&pos,procprog]"
ac_cv_ps_varlist="[&procuid,&procppid,&procvsz,&procrss,procstat,&pos,procprog]"
ac_cv_ps_command="$PATH_TO_PS -laxnwww"
ac_cv_ps_format="%*s %d %*s %d %*s %*s %*s %*s %*s %*s %s %*s %*s %n%s"
ac_cv_vsz_command="$PATH_TO_PS laxnwww"
ac_cv_vsz_format="%*s %*s %*s %*s %*s %*s %*s %d"
ac_cv_rss_command="$PATH_TO_PS laxnwww"
ac_cv_rss_format="%*s %*s %*s %*s %*s %*s %*s %*s %d"
ac_cv_ps_format="%*s %d %*s %d %*s %*s %*s %d %d %*s %s %*s %*s %n%s"
EXTRAS="$EXTRAS check_nagios"
AC_MSG_RESULT([$ac_cv_ps_command])
@ -682,13 +666,9 @@ dnl
elif ps laxnwww 2>/dev/null | \
egrep -i ["^ *F(LAGS)? +UID +PID +PPID +PRI +NI +(VSZ)|(SIZE) +RSS +WCHAN +STAT? TTY +TIME +COMMAND"] >/dev/null
then
ac_cv_ps_varlist="[&procuid,&procppid,procstat,&pos,procprog]"
ac_cv_ps_varlist="[&procuid,&procppid,procstat,&procvsz,&procrss,&pos,procprog]"
ac_cv_ps_command="$PATH_TO_PS laxnwww"
ac_cv_ps_format="%*s %d %*s %d %*s %*s %*s %*s %*s %s %*s %*s %n%s"
ac_cv_vsz_command="$PATH_TO_PS laxnwww"
ac_cv_vsz_format="%*s %*s %*s %*s %*s %*s %d"
ac_cv_rss_command="$PATH_TO_PS laxnwww"
ac_cv_rss_format="%*s %*s %*s %*s %*s %*s %*s %d"
ac_cv_ps_format="%*s %d %*s %d %*s %*s %d %d %*s %s %*s %*s %n%s"
EXTRAS="$EXTRAS check_nagios"
AC_MSG_RESULT([$ac_cv_ps_command])
@ -696,13 +676,9 @@ dnl OpenBSD (needs to come early because -exo appears to work, but does not give
elif ps -axo 'stat comm vsz rss user uid ppid args' 2>/dev/null | \
egrep -i ["^ *S[TAUES]* +[UCOMDNA]+ +[VSIZE]+ +R[S]+ +U[SER]+ +U[ID]+ +P[PID]+ +[RGSCOMDNA]+"] >/dev/null
then
ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS -axo 'stat uid ppid comm args'"
ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS -axo 'stat uid ppid vsz rss pcpu comm args'"
ac_cv_ps_format="%s %d %d %s %n"
ac_cv_vsz_command="$PATH_TO_PS -axo 'vsz comm'"
ac_cv_vsz_format="%d %s"
ac_cv_rss_command="$PATH_TO_PS -axo 'rss comm'"
ac_cv_rss_format="%d %s"
EXTRAS="$EXTRAS check_nagios"
AC_MSG_RESULT([$ac_cv_ps_command])
@ -710,65 +686,45 @@ dnl AIX 4.3.3 - needs verification. This works for Tru64 - needs %*[ +] in PS_FO
elif ps -ao 'stat comm vsz rss user uid ppid args' 2>/dev/null | \
egrep -i ["^ *S[TAUES]* +[UCOMDNA]+ +[VSIZE]+ +R[S]+ +U[SER]+ +U[ID]+ +P[PID]+ +[RGSCOMDNA]+"] >/dev/null
then
ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS -ao 'stat uid ppid comm args'"
ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS -ao 'stat uid ppid vsz rss pcpu comm args'"
ac_cv_ps_format="[["%s%*[ +] %d %d %s %n"]]"
ac_cv_vsz_command="$PATH_TO_PS -ao 'vsz comm'"
ac_cv_vsz_format="%d %s"
ac_cv_rss_command="$PATH_TO_PS -ao 'rss comm'"
ac_cv_rss_format="%d %s"
EXTRAS="$EXTRAS check_nagios"
AC_MSG_RESULT([$ac_cv_ps_command])
elif ps -eo 's comm vsz rss user uid ppid args' 2>/dev/null | \
egrep -i ["^S[TAUES]* +C[OMDNA]+ +[VSIZE]+ +U[SER]+ +U[ID]+ +P[PID]+ +[RGSCOMDNA]+"] >/dev/null
then
ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS -eo 's uid ppid comm args'"
ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS -eo 's uid ppid vsz rss pcpu comm args'"
ac_cv_ps_format="%s %d %d %s %n"
ac_cv_vsz_command="$PATH_TO_PS -eo 'vsz comm'"
ac_cv_vsz_format="%d %s"
ac_cv_rss_command="$PATH_TO_PS -eo 'rss comm'"
ac_cv_rss_format="%d %s"
EXTRAS="$EXTRAS check_nagios"
AC_MSG_RESULT([$ac_cv_ps_command])
elif ps -Ao 's comm vsz rss uid user ppid args' 2>/dev/null | \
egrep -i ["^S[TAUES]* +C[OMDNA]+ +V[SIZE]+ +RSS +UID +USER +PPID +[RGSCOMDNA]+"] >/dev/null
then
ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS -Ao 's uid ppid comm args'"
ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS -Ao 's uid ppid vsz rss pcpu comm args'"
ac_cv_ps_format="%s %d %d %s %n"
ac_cv_vsz_command="$PATH_TO_PS -Ao 'vsz comm'"
ac_cv_vsz_format="%d %s"
ac_cv_rss_command="$PATH_TO_PS -Ao 'rss comm'"
ac_cv_rss_format="%d %s"
EXTRAS="$EXTRAS check_nagios"
AC_MSG_RESULT([$ac_cv_ps_command])
elif ps -Ao 'status comm vsz rss uid user ppid args' 2>/dev/null | \
egrep -i ["^S[TAUES]* +C[OMDNA]+ +V[SIZE]+ +RSS +UID +USER +PPID +[RGSCOMDNA]+"] >/dev/null
then
ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS -Ao 'status uid ppid comm args'"
ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS -Ao 'status uid ppid vsz rss pcpu comm args'"
ac_cv_ps_format="%s %d %d %s %n"
ac_cv_vsz_command="$PATH_TO_PS -Ao 'vsz comm'"
ac_cv_vsz_format="%d %s"
ac_cv_rss_command="$PATH_TO_PS -Ao 'rss comm'"
ac_cv_rss_format="%d %s"
EXTRAS="$EXTRAS check_nagios"
AC_MSG_RESULT([$ac_cv_ps_command])
elif ps -Ao 'state comm vsz rss uid user ppid args' 2>/dev/null | \
egrep -i ["^S[TAUES]* +C[OMDNA]+ +V[SIZE]+ +RSS +UID +USER +PPID +[RGSCOMDNA]+"] >/dev/null
then
ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS -Ao 'state uid ppid comm args'"
ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS -Ao 'state uid ppid vsz rss pcpu comm args'"
ac_cv_ps_format="%s %d %d %s %n"
ac_cv_vsz_command="$PATH_TO_PS -Ao 'vsz comm'"
ac_cv_vsz_format="%d %s"
ac_cv_rss_command="$PATH_TO_PS -Ao 'rss comm'"
ac_cv_rss_format="%d %s"
EXTRAS="$EXTRAS check_nagios"
AC_MSG_RESULT([$ac_cv_ps_command])
@ -776,13 +732,9 @@ dnl wonder who takes state instead of stat
elif ps -ao 'state command vsz rss user ppid args' 2>/dev/null | \
egrep -i ["^S[TAUES]* +C[OMDNA]+ +V[SIZE]+ +RSS +UID +USER +PPID +[RGSCOMDNA]+"] >/dev/null
then
ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS -ao 'state uid ppid command args'"
ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS -ao 'state uid ppid vsz rss pcpu command args'"
ac_cv_ps_format="%s %d %d %s %n"
ac_cv_vsz_command="$PATH_TO_PS -ao 'vsz command'"
ac_cv_vsz_format="%d %s"
ac_cv_rss_command="$PATH_TO_PS -ao 'rss command'"
ac_cv_rss_format="%d %s"
EXTRAS="$EXTRAS check_nagios"
AC_MSG_RESULT([$ac_cv_ps_command])
@ -790,13 +742,9 @@ dnl IRIX 53
elif ps -el 2>/dev/null | \
egrep -i ["^ *F +S +UID +PID +PPID +C +PRI +NI +P +SZ +RSS +WCHAN +TTY +TIME +[RGSCOMDNA]+"] >/dev/null
then
ac_cv_ps_varlist="[procstat,&procuid,&procppid,&pos,procprog]"
ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&pos,procprog]"
ac_cv_ps_command="$PATH_TO_PS -el"
ac_cv_ps_format="%*s %s %d %*s %d %*s %*s %*s %*s %*s %*s %*s %*s %*s %n%s"
ac_cv_vsz_command="$PATH_TO_PS -el"
ac_cv_vsz_format="%*s %*s %*s %*s %d"
ac_cv_rss_command="$PATH_TO_PS -el"
ac_cv_rss_format="%*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %d"
ac_cv_ps_format="%*s %s %d %*s %d %*s %*s %*s %*s %d %d %*s %*s %*s %n%s"
AC_MSG_RESULT([$ac_cv_ps_command])
dnl IRIX 63
@ -806,10 +754,6 @@ then
ac_cv_ps_varlist="[procstat,&procuid,&procppid,&pos,procprog]"
ac_cv_ps_command="$PATH_TO_PS -el"
ac_cv_ps_format="%*s %s %d %*s %d %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %n%s"
ac_cv_vsz_command="$PATH_TO_PS -el"
ac_cv_vsz_format="%*s %*s %*s %*s %d"
ac_cv_rss_command="$PATH_TO_PS -el"
ac_cv_rss_format="%*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %d"
AC_MSG_RESULT([$ac_cv_ps_command])
dnl AIX 4.1:
@ -821,39 +765,28 @@ then
ac_cv_ps_varlist="[procstat,&procuid,&procppid,&pos,procprog]"
ac_cv_ps_command="$PATH_TO_PS -el"
ac_cv_ps_format="%*s %s %d %*s %d %*s %*s %*s %*s %*s %*s %*s %*s %n%s"
ac_cv_vsz_command="$PATH_TO_PS -el"
ac_cv_vsz_format="%*s %*s %*s %*s %*s %*s %*s %*s %*s %d"
ac_cv_rss_command="$PATH_TO_PS -el"
ac_cv_rss_format="%*s %*s %*s %*s %*s %*s %*s %*s %*s %d"
AC_MSG_RESULT([$ac_cv_ps_command])
dnl AIX?
elif ps glaxen 2>/dev/null | \
egrep -i ["^ *F +UID +PID +PPID +PRI +NI +VSZ +RSS +WCHAN +STAT +TTY +TIME +COMMAND"] >/dev/null
then
ac_cv_ps_varlist="[&procuid,&procppid,procstat,&pos,procprog]"
ac_cv_ps_varlist="[&procuid,&procppid,&procvsz,&procrss,procstat,&pos,procprog]"
ac_cv_ps_command="$PATH_TO_PS glaxen"
ac_cv_ps_format="%*s %d %*s %d %*s %*s %*s %*s %*s %s %*s %*s %n%s"
ac_cv_vsz_command="$PATH_TO_PS glaxen"
ac_cv_vsz_format="%*s %*s %*s %*s %*s %*s %d"
ac_cv_rss_command="$PATH_TO_PS glaxen"
ac_cv_rss_format="%*s %*s %*s %*s %*s %*s %*s %d"
ac_cv_ps_format="%*s %d %*s %d %*s %*s %d %d %*s %s %*s %*s %n%s"
AC_MSG_RESULT([$ac_cv_ps_command])
dnl MacOSX / Darwin
dnl TODO: MacOSX has commands with spaces which will cause problems to PS_FORMAT
dnl STAT VSZ RSS UID USER PPID UCOMM COMMAND
dnl Ss 1308 272 0 root 0 init /sbin/init
elif ps waxo 'state vsz rss uid user ppid ucomm command' 2>/dev/null | \
egrep -i ["^STAT +VSZ +RSS +UID +USER +PPID +UCOMM +COMMAND"] >/dev/null
dnl Some truncation will happen in UCOMM column
dnl STAT VSZ RSS UID PPID %CPU UCOMM COMMAND
dnl Ss 52756 22496 501 1 6.9 Window Manager /System/Library/CoreServices/WindowServer -daemon
elif ps wwaxo 'state vsz rss uid ppid pcpu ucomm command' 2>/dev/null | \
egrep -i ["^STAT +VSZ +RSS +UID +PPID +%CPU +UCOMM +COMMAND"] >/dev/null
then
ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]"
ac_cv_ps_command="$PATH_TO_PS waxo 'state uid ppid ucomm command'"
ac_cv_ps_format="%s %d %d %s %n"
ac_cv_vsz_command="$PATH_TO_PS waxco 'vsz command'"
ac_cv_vsz_format="%d %s"
ac_cv_rss_command="$PATH_TO_PS waxco 'rss command'"
ac_cv_rss_format="%d %s"
ac_cv_ps_command="$PATH_TO_PS wwaxo 'state vsz rss uid ppid pcpu ucomm command'"
ac_cv_ps_varlist="[procstat,&procvsz,&procrss,&procuid,&procppid,&procpcpu,procprog,&pos]"
ac_cv_ps_format="%s %d %d %d %d %f %s %n"
EXTRAS="$EXTRAS check_nagios"
AC_MSG_RESULT([$ac_cv_ps_command])
@ -864,12 +797,12 @@ then
ac_cv_ps_varlist="[procstat,&procuid,&procppid,&pos,procprog]"
ac_cv_ps_command="$PATH_TO_PS -Al"
ac_cv_ps_format="%*s %s %d %*s %d %*s %*s %*s %*s %*s %*s %*s %*s %*s %n%s"
if ps -Ao 'vsz comm' 2>/dev/null | \
egrep -i ["^ *VSZ +COMMAND"] >/dev/null
then
ac_cv_vsz_command="$PATH_TO_PS -Ao 'vsz comm'"
ac_cv_vsz_format="%*s %d"
fi
#if ps -Ao 'vsz comm' 2>/dev/null | \
# egrep -i ["^ *VSZ +COMMAND"] >/dev/null
#then
# ac_cv_vsz_command="$PATH_TO_PS -Ao 'vsz comm'"
# ac_cv_vsz_format="%*s %d"
#fi
AC_MSG_RESULT([$ac_cv_ps_command])
else
@ -882,14 +815,6 @@ AC_DEFINE_UNQUOTED(PS_COMMAND,"$ac_cv_ps_command",
[Verbatim command to execute for ps in check_procs])
AC_DEFINE_UNQUOTED(PS_FORMAT,"$ac_cv_ps_format",
[Format string for scanning ps output in check_procs])
AC_DEFINE_UNQUOTED(VSZ_COMMAND,"$ac_cv_vsz_command",
[Verbatim command to execute for ps in check_vsz])
AC_DEFINE_UNQUOTED(VSZ_FORMAT,"$ac_cv_vsz_format",
[Format string for scanning ps output in check_vsz])
AC_DEFINE_UNQUOTED(RSS_COMMAND,"$ac_cv_rss_command",
[Verbatim command to execute for ps in check_rss])
AC_DEFINE_UNQUOTED(RSS_FORMAT,"$ac_cv_rss_format",
[Format string for scanning ps output in check_rss])
AC_PATH_PROG(PATH_TO_DF,df)
AC_PATH_PROG(PATH_TO_BDF,bdf)

View file

@ -7,7 +7,7 @@ INCLUDES = -I.. -I$(top_srcdir)/lib @LDAPINCLUDE@ @PGINCLUDE@ @SSLINCLUDE@
libexec_PROGRAMS = check_disk check_dummy check_http check_load \
check_mrtg check_mrtgtraf check_nwstat check_overcr check_ping \
check_procs check_real check_smtp check_ssh check_tcp check_time \
check_udp check_ups check_users check_vsz negate urlize \
check_udp check_ups check_users negate urlize \
@EXTRAS@
EXTRA_PROGRAMS = check_mysql check_radius check_pgsql check_snmp check_hpjd \
@ -68,7 +68,6 @@ check_time_LDADD = $(NETLIBS)
check_udp_LDADD = $(NETLIBS)
check_ups_LDADD = $(NETLIBS)
check_users_LDADD = $(BASEOBJS) popen.o
check_vsz_LDADD = $(BASEOBJS) popen.o
check_by_ssh_LDADD = $(NETLIBS) popen.o
negate_LDADD = $(BASEOBJS) popen.o
urlize_LDADD = $(BASEOBJS) popen.o
@ -104,7 +103,6 @@ check_time_DEPENDENCIES = check_time.c $(NETOBJS) $(DEPLIBS)
check_udp_DEPENDENCIES = check_udp.c $(NETOBJS) $(DEPLIBS)
check_ups_DEPENDENCIES = check_ups.c $(NETOBJS) $(DEPLIBS)
check_users_DEPENDENCIES = check_users.c $(BASEOBJS) popen.o $(DEPLIBS)
check_vsz_DEPENDENCIES = check_vsz.c $(BASEOBJS) popen.o $(DEPLIBS)
check_by_ssh_DEPENDENCIES = check_by_ssh.c $(NETOBJS) popen.o $(DEPLIBS)
negate_DEPENDENCIES = negate.c $(BASEOBJS) popen.o $(DEPLIBS)
urlize_DEPENDENCIES = urlize.c $(BASEOBJS) popen.o $(DEPLIBS)

View file

@ -55,6 +55,9 @@ main (int argc, char **argv)
FILE *fp;
int procuid = 0;
int procppid = 0;
int procvsz = 0;
int procrss = 0;
float procpcpu = 0;
char procstat[8];
char procprog[MAX_INPUT_BUFFER];
char *procargs;
@ -106,7 +109,7 @@ main (int argc, char **argv)
/* count the number of matching Nagios processes... */
while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) {
cols = sscanf (input_buffer, PS_FORMAT, PS_VARLIST);
if ( cols >= 4 ) {
if ( cols >= 6 ) {
asprintf (&procargs, "%s", input_buffer + pos);
strip (procargs);

View file

@ -39,11 +39,64 @@ const char *progname = "check_procs";
#define COPYRIGHT "1999-2002"
#define AUTHOR "Ethan Galstad"
#define EMAIL "nagios@nagios.org"
#define SUMMARY "Check the number of currently running processes and generates WARNING or\n\
CRITICAL states if the process count is outside the specified threshold\n\
ranges. The process count can be filtered by process owner, parent process\n\
PID, current state (e.g., 'Z'), or may be the total number of running\n\
processes\n"
#define SUMMARY "\
Checks all processes and generates WARNING or CRITICAL states if the specified\n\
metric is outside the required threshold ranges. The metric defaults to number\n\
of processes. Search filters can be applied to limit the processes to check.\n"
#define OPTIONS "\
-w <range> -c <range> [-m metric]\n\
[-s state] [-p ppid] [-u user] [-r rss] [-z vsz] [-P %cpu]\n\
[-a argument-array] [-C command] [-v]"
#define LONGOPTIONS "\
Required Arguments:\n\
-w, --warning=RANGE\n\
Generate warning state if metric is outside this range\n\
-c, --critical=RANGE\n\
Generate critical state if metric is outside this range\n\
Optional Arguments:\n\
-m, --metric=TYPE\n\
Check thresholds against metric. Valid types:\n\
PROCS - number of processes (default)\n\
VSZ - virtual memory size\n\
RSS - resident set memory size\n\
CPU - percentage cpu\n\
-v, --verbose\n\
Extra information. Up to 3 verbosity levels\n\
Optional Filters:\n\
-s, --state=STATUSFLAGS\n\
Only scan for processes that have, in the output of `ps`, one or\n\
more of the status flags you specify (for example R, Z, S, RS,\n\
RSZDT, plus others based on the output of your 'ps' command).\n\
-p, --ppid=PPID\n\
Only scan for children of the parent process ID indicated.\n\
-z, --vsz=VSZ\n\
Only scan for processes with vsz higher than indicated.\n\
-r, --rss=RSS\n\
Only scan for processes with rss higher than indicated.\n\
-P, --pcpu=PCPU\n\
Only scan for processes with pcpu higher than indicated.\n\
-u, --user=USER\n\
Only scan for processes with user name or ID indicated.\n\
-a, --argument-array=STRING\n\
Only scan for ARGS that match up to the length of the given STRING.\n\
-C, --command=COMMAND\n\
Only scan for exact matches to the named COMMAND.\n\
\n\
RANGEs are specified 'min:max' or 'min:' or ':max' (or 'max'). If\n\
specified 'max:min', a warning status will be generated if the\n\
count is inside the specified range\n"
#define EXAMPLES "\
check_procs -w 2:2 -c 2:1024 -C portsentry\n\
Warning if not two processes with command name portsentry. Critical\n\
if < 2 or > 1024 processes\n\
check_procs -w 10 -a '/usr/local/bin/perl' -u root\n\
Warning alert if > 10 processes with command arguments containing \n\
'/usr/local/bin/perl' and owned by root\n\
check_procs -w 50000 -c 100000 --metric=VSZ\n\
Alert if vsz of any processes over 50K or 100K\n"
#include "config.h"
#include <pwd.h>
@ -55,6 +108,7 @@ int process_arguments (int, char **);
int validate_arguments (void);
void print_usage (void);
void print_help (void);
int check_thresholds (int);
int wmax = -1;
int cmax = -1;
@ -68,16 +122,30 @@ int options = 0; /* bitmask of filter criteria to test against */
#define USER 8
#define PROG 16
#define ARGS 32
#define VSZ 64
#define RSS 128
#define PCPU 256
int verbose = FALSE;
/* Different metrics */
int metric = 0;
#define METRIC_PROCS 0
#define METRIC_VSZ 1
#define METRIC_RSS 2
#define METRIC_CPU 3
char *metric_name = "";
int verbose = 0;
int uid;
int ppid;
int vsz;
int rss;
float pcpu;
char *statopts = "";
char *prog = "";
char *args = "";
char *fmt = "";
char *fails = "";
char tmp[MAX_INPUT_BUFFER];
const char *zombie = "Z";
int
main (int argc, char **argv)
@ -86,24 +154,35 @@ main (int argc, char **argv)
int procuid = 0;
int procppid = 0;
int procvsz = 0;
int procrss = 0;
float procpcpu = 0;
char procstat[8];
char procprog[MAX_INPUT_BUFFER];
char *procargs;
const char *zombie = "Z";
int resultsum = 0; /* bitmask of the filter criteria met by a process */
int found = 0; /* counter for number of lines returned in `ps` output */
int procs = 0; /* counter for number of processes meeting filter criteria */
int pos; /* number of spaces before 'args' in `ps` output */
int cols; /* number of columns in ps output */
int warn = 0; /* number of processes in warn state */
int crit = 0; /* number of processes in crit state */
int i;
int result = STATE_UNKNOWN;
asprintf (&metric_name, "PROCS");
metric = METRIC_PROCS;
if (process_arguments (argc, argv) == ERROR)
usage ("Unable to parse command line\n");
/* run the command */
if (verbose)
printf ("%s\n", PS_COMMAND);
if (verbose >= 2)
printf ("CMD: %s\n", PS_COMMAND);
child_process = spopen (PS_COMMAND);
if (child_process == NULL) {
printf ("Could not open pipe: %s\n", PS_COMMAND);
@ -117,18 +196,22 @@ main (int argc, char **argv)
fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process);
while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) {
strcpy(procprog,"");
asprintf(&procargs,"");
cols = sscanf (input_buffer, PS_FORMAT, PS_VARLIST);
/* Zombie processes do not give a procprog command */
/* - would they give other columns? */
if ( cols == 3 && strstr(procstat, zombie) ) {
strcpy(procprog, "");
cols = 4;
}
if ( cols >= 4 ) {
if ( cols >= 7 ) {
found++;
resultsum = 0;
asprintf (&procargs, "%s", input_buffer + pos);
strip (procargs);
if ((options & STAT) && (strstr (statopts, procstat)))
resultsum |= STAT;
if ((options & ARGS) && procargs && (strstr (procargs, args) == procargs))
@ -139,16 +222,43 @@ main (int argc, char **argv)
resultsum |= PPID;
if ((options & USER) && (procuid == uid))
resultsum |= USER;
#ifdef DEBUG1
if (procargs == NULL)
printf ("%d %d %d %s %s\n", procs, procuid, procppid, procstat,
procprog);
else
printf ("%d %d %d %s %s %s\n", procs, procuid, procppid, procstat,
procprog, procargs);
#endif
if (options == resultsum)
procs++;
if ((options & VSZ) && (procvsz >= vsz))
resultsum |= VSZ;
if ((options & RSS) && (procrss >= rss))
resultsum |= RSS;
if ((options & PCPU) && (procpcpu >= pcpu))
resultsum |= PCPU;
if (verbose >= 3)
printf ("%d %d %d %d %d %.2f %s %s %s\n",
procs, procuid, procvsz, procrss,
procppid, procpcpu, procstat, procprog, procargs);
/* Next line if filters not matched */
if (!(options == resultsum || options == ALL))
continue;
procs++;
if (metric == METRIC_VSZ)
i = check_thresholds (procvsz);
else if (metric == METRIC_RSS)
i = check_thresholds (procrss);
/* TODO? float thresholds for --metric=CPU */
else if (metric == METRIC_CPU)
i = check_thresholds ((int)procpcpu);
if (metric != METRIC_PROCS) {
if (i == STATE_WARNING) {
warn++;
asprintf (&fails, "%s%s%s", fails, (fails == "" ? "" : ", "), procprog);
}
if (i == STATE_CRITICAL) {
crit++;
asprintf (&fails, "%s%s%s", fails, (fails == "" ? "" : ", "), procprog);
}
result = max_state (result, i);
}
}
/* This should not happen */
else if (verbose) {
@ -172,65 +282,83 @@ main (int argc, char **argv)
result = max_state (result, STATE_WARNING);
}
if (options == ALL)
procs = found;
if (found == 0) { /* no process lines parsed so return STATE_UNKNOWN */
printf ("Unable to read output\n");
return result;
}
if (verbose && (options & STAT))
printf ("%s ", statopts);
if (verbose && (options & PROG))
printf ("%s ", prog);
if (verbose && (options & PPID))
printf ("%d ", ppid);
if (verbose && (options & USER))
printf ("%d ", uid);
if ( result == STATE_UNKNOWN )
result = STATE_OK;
/* Needed if procs found, but none match filter */
if ( metric == METRIC_PROCS ) {
result = max_state (result, check_thresholds (procs) );
}
if ( result == STATE_OK ) {
printf ("%s OK: %d process%s",
metric_name, procs, ( procs != 1 ? "es" : "") );
} else if (result == STATE_WARNING) {
if ( metric == METRIC_PROCS ) {
printf ("PROCS WARNING: %d process%s", procs,
( procs != 1 ? "es" : ""));
} else {
printf ("%s WARNING: %d warn out of %d process%s",
metric_name, warn, procs,
( procs != 1 ? "es" : ""));
}
} else if (result == STATE_CRITICAL) {
if (metric == METRIC_PROCS) {
printf ("PROCS CRITICAL: %d process%s", procs,
( procs != 1 ? "es" : ""));
} else {
printf ("%s CRITICAL: %d crit, %d warn out of %d process%s",
metric_name, crit, warn, procs,
( procs != 1 ? "es" : ""));
}
}
if (fmt != "") {
printf (" with %s", fmt);
}
if ( verbose >= 1 && fails != "" )
printf (" [%s]", fails);
printf ("\n");
return result;
}
/* Check thresholds against value */
int
check_thresholds (int value)
{
if (wmax == -1 && cmax == -1 && wmin == -1 && cmin == -1) {
if (result == STATE_UNKNOWN)
result = STATE_OK;
printf (fmt, "OK", procs);
return result;
return OK;
}
else if (cmax >= 0 && cmin >= 0 && cmax < cmin) {
if (procs > cmax && procs < cmin) {
printf (fmt, "CRITICAL", procs);
if (value > cmax && value < cmin)
return STATE_CRITICAL;
}
}
else if (cmax >= 0 && procs > cmax) {
printf (fmt, "CRITICAL", procs);
else if (cmax >= 0 && value > cmax) {
return STATE_CRITICAL;
}
else if (cmin >= 0 && procs < cmin) {
printf (fmt, "CRITICAL", procs);
else if (cmin >= 0 && value < cmin) {
return STATE_CRITICAL;
}
if (wmax >= 0 && wmin >= 0 && wmax < wmin) {
if (procs > wmax && procs < wmin) {
printf (fmt, "CRITICAL", procs);
return STATE_CRITICAL;
if (value > wmax && value < wmin) {
return STATE_WARNING;
}
}
else if (wmax >= 0 && procs > wmax) {
printf (fmt, "WARNING", procs);
return max_state (result, STATE_WARNING);
else if (wmax >= 0 && value > wmax) {
return STATE_WARNING;
}
else if (wmin >= 0 && procs < wmin) {
printf (fmt, "WARNING", procs);
return max_state (result, STATE_WARNING);
else if (wmin >= 0 && value < wmin) {
return STATE_WARNING;
}
printf (fmt, "OK", procs);
if ( result == STATE_UNKNOWN ) {
result = STATE_OK;
}
return result;
return STATE_OK;
}
/* process command-line arguments */
@ -244,10 +372,14 @@ process_arguments (int argc, char **argv)
static struct option long_options[] = {
{"warning", required_argument, 0, 'w'},
{"critical", required_argument, 0, 'c'},
{"metric", required_argument, 0, 'm'},
{"timeout", required_argument, 0, 't'},
{"status", required_argument, 0, 's'},
{"ppid", required_argument, 0, 'p'},
{"command", required_argument, 0, 'C'},
{"vsz", required_argument, 0, 'z'},
{"rss", required_argument, 0, 'r'},
{"pcpu", required_argument, 0, 'P'},
{"argument-array", required_argument, 0, 'a'},
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'V'},
@ -260,7 +392,8 @@ process_arguments (int argc, char **argv)
strcpy (argv[c], "-t");
while (1) {
c = getopt_long (argc, argv, "Vvht:c:w:p:s:u:C:a:", long_options, &option_index);
c = getopt_long (argc, argv, "Vvht:c:w:p:s:u:C:a:z:r:m:P:",
long_options, &option_index);
if (c == -1 || c == EOF)
break;
@ -368,17 +501,70 @@ process_arguments (int argc, char **argv)
break;
case 'C': /* command */
asprintf (&prog, "%s", optarg);
asprintf (&fmt, "%s%scommand name %s", fmt, (options ? ", " : ""),
asprintf (&fmt, "%s%scommand name '%s'", fmt, (options ? ", " : ""),
prog);
options |= PROG;
break;
case 'a': /* args (full path name with args) */
asprintf (&args, "%s", optarg);
asprintf (&fmt, "%s%sargs %s", fmt, (options ? ", " : ""), args);
asprintf (&fmt, "%s%sargs '%s'", fmt, (options ? ", " : ""), args);
options |= ARGS;
break;
case 'r': /* RSS */
if (sscanf (optarg, "%d%[^0-9]", &rss, tmp) == 1) {
asprintf (&fmt, "%s%sRSS >= %d", fmt, (options ? ", " : ""), rss);
options |= RSS;
break;
}
printf ("%s: RSS must be an integer!\n\n",
progname);
print_usage ();
exit (STATE_UNKNOWN);
case 'z': /* VSZ */
if (sscanf (optarg, "%d%[^0-9]", &vsz, tmp) == 1) {
asprintf (&fmt, "%s%sVSZ >= %d", fmt, (options ? ", " : ""), vsz);
options |= VSZ;
break;
}
printf ("%s: VSZ must be an integer!\n\n",
progname);
print_usage ();
exit (STATE_UNKNOWN);
case 'P': /* PCPU */
/* TODO: -P 1.5.5 is accepted */
if (sscanf (optarg, "%f%[^0-9.]", &pcpu, tmp) == 1) {
asprintf (&fmt, "%s%sPCPU >= %.2f", fmt, (options ? ", " : ""), pcpu);
options |= PCPU;
break;
}
printf ("%s: PCPU must be a float!\n\n",
progname);
print_usage ();
exit (STATE_UNKNOWN);
case 'm':
asprintf (&metric_name, "%s", optarg);
if ( strcmp(optarg, "PROCS") == 0) {
metric = METRIC_PROCS;
break;
}
else if ( strcmp(optarg, "VSZ") == 0) {
metric = METRIC_VSZ;
break;
}
else if ( strcmp(optarg, "RSS") == 0 ) {
metric = METRIC_RSS;
break;
}
else if ( strcmp(optarg, "CPU") == 0 ) {
metric = METRIC_CPU;
break;
}
printf ("%s: metric must be one of PROCS, VSZ, RSS, CPU!\n\n",
progname);
print_usage ();
exit (STATE_UNKNOWN);
case 'v': /* command */
verbose = TRUE;
verbose++;
break;
}
}
@ -402,7 +588,7 @@ int
validate_arguments ()
{
if (wmax >= 0 && wmin == -1)
if (wmax >= 0 && wmin == -1)
wmin = 0;
if (cmax >= 0 && cmin == -1)
cmin = 0;
@ -422,13 +608,8 @@ if (wmax >= 0 && wmin == -1)
/* return ERROR; */
/* } */
if (options == 0) {
options = 1;
asprintf (&fmt, "%%s - %%d processes running\n");
}
else {
asprintf (&fmt, "%%s - %%d processes running with %s\n", fmt);
}
if (options == 0)
options = ALL;
return options;
}
@ -442,37 +623,14 @@ print_help (void)
("Copyright (c) %s %s <%s>\n\n%s\n",
COPYRIGHT, AUTHOR, EMAIL, SUMMARY);
print_usage ();
printf
("\nRequired Arguments:\n"
" -w, --warning=RANGE\n"
" generate warning state if process count is outside this range\n"
" -c, --critical=RANGE\n"
" generate critical state if process count is outside this range\n\n"
"Optional Filters:\n"
" -s, --state=STATUSFLAGS\n"
" Only scan for processes that have, in the output of `ps`, one or\n"
" more of the status flags you specify (for example R, Z, S, RS,\n"
" RSZDT, plus others based on the output of your 'ps' command).\n"
" -p, --ppid=PPID\n"
" Only scan for children of the parent process ID indicated.\n"
" -u, --user=USER\n"
" Only scan for proceses with user name or ID indicated.\n"
" -a, --argument-array=STRING\n"
" Only scan for ARGS that match up to the length of the given STRING\n"
" -C, --command=COMMAND\n"
" Only scan for exact matches to the named COMMAND.\n\n"
"RANGEs are specified 'min:max' or 'min:' or ':max' (or 'max'). If\n"
"specified 'max:min', a warning status will be generated if the\n"
"count is inside the specified range\n");}
printf ("\nOptions:\n" LONGOPTIONS "\nExamples:\n" EXAMPLES "\n");
}
void
print_usage (void)
{
printf
("Usage:\n"
" check_procs -w <range> -c <range> [-s state] [-p ppid] [-u user]\n"
" [-a argument-array] [-C command]\n"
" check_procs --version\n" " check_procs --help\n");
printf ("Usage:\n" " %s %s\n"
" %s (-h | --help) for detailed help\n"
" %s (-V | --version) for version information\n",
progname, OPTIONS, progname, progname);
}

View file

@ -1,250 +0,0 @@
/******************************************************************************
*
* CHECK_VSZ.C
*
* Program: Process plugin for Nagios
* License: GPL
* Copyright (c) 1999,2000 Karl DeBisschop <kdebiss@alum.mit.edu>
*
* Last Modified: $Date$
*
* Description:
*
* This plugin will check for processes whose total image size exceeds
* the warning or critical thresholds given on the command line. With
* no command_name, everything that shows up on ps is evaluated.
* Otherwise, only jobs with the command_name given are examined.
* This program is particularly useful if you have to run a piece of
* commercial software that has a memory leak. With it you can shut
* down and restart the processes whenever the program threatens to
* take over your system.
*
* Modifications:
*
* 11-18-1999 Karl DeBisschop (kdebiss@alum.mit.edu)
* change to getopt, use print_help
* 08-18-1999 Ethan Galstad (nagios@nagios.org)
* Changed code to use common include file
* Changed fclose() to pclose()
* 09-09-1999 Ethan Galstad (nagios@nagios.org)
* Changed popen()/pclose() to spopen()/spclose()
* 11-18-1999 Karl DeBisschop (kdebiss@alum.mit.edu)
* set STATE_WARNING of stderr written or nonzero status returned
*
*****************************************************************************/
const char *progname = "check_vsz";
#define REVISION "$Revision$"
#define COPYRIGHT "1999-2002"
#define AUTHOR "Karl DeBisschop"
#define EMAIL "karl@debisschop.net"
#define SUMMARY "Check the image size of a running program.\n"
#include "common.h"
#include "popen.h"
#include "utils.h"
int process_arguments (int argc, char **argv);
void print_help (const char *cmd);
void print_usage (const char *cmd);
int warn = -1;
int crit = -1;
char *proc = NULL;
int
main (int argc, char **argv)
{
int len;
int result = STATE_OK;
int line = 0;
int proc_size = -1;
char input_buffer[MAX_INPUT_BUFFER];
char proc_name[MAX_INPUT_BUFFER];
char *message = "";
if (process_arguments (argc, argv) == ERROR) {
printf ("%s: failure parsing arguments\n", progname);
print_help (progname);
return STATE_UNKNOWN;
}
/* run the command */
child_process = spopen (VSZ_COMMAND);
if (child_process == NULL) {
printf ("Unable to open pipe: %s\n", VSZ_COMMAND);
return STATE_UNKNOWN;
}
child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r");
if (child_stderr == NULL)
printf ("Could not open stderr for %s\n", VSZ_COMMAND);
while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) {
line++;
/* skip the first line */
if (line == 1)
continue;
if (sscanf (input_buffer, VSZ_FORMAT, &proc_size, proc_name) == 2) {
if (proc == NULL) {
if (proc_size > warn) {
asprintf (&message, "%s %s(%d)", message, proc_name, proc_size);
result = max_state (result, STATE_WARNING);
}
if (proc_size > crit) {
result = STATE_CRITICAL;
}
}
else if (strstr (proc_name, proc)) {
asprintf (&message, "%s %d", message, proc_size);
if (proc_size > warn) {
result = max_state (result, STATE_WARNING);
}
if (proc_size > crit) {
result = STATE_CRITICAL;
}
}
}
}
/* If we get anything on STDERR, at least set warning */
while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr))
result = max_state (result, STATE_WARNING);
(void) fclose (child_stderr);
/* close the pipe */
if (spclose (child_process))
result = max_state (result, STATE_WARNING);
if (result == STATE_OK)
printf ("ok (all VSZ<%d): %s\n", warn, message);
else if (result == STATE_UNKNOWN)
printf ("Unable to read output\n");
else if (result == STATE_WARNING)
printf ("WARNING (VSZ>%d):%s\n", warn, message);
else
printf ("CRITICAL (VSZ>%d):%s\n", crit, message);
return result;
}
int
process_arguments (int argc, char **argv)
{
int c;
int option_index = 0;
static struct option long_options[] = {
{"help", no_argument, 0, 'h'},
{"version", no_argument, 0, 'V'},
{"critical", required_argument, 0, 'c'},
{"warning", required_argument, 0, 'w'},
{"command", required_argument, 0, 'C'},
{0, 0, 0, 0}
};
if (argc < 2)
return ERROR;
while (1) {
c = getopt_long (argc, argv, "+hVc:w:C:", long_options, &option_index);
if (c == EOF)
break;
switch (c) {
case '?': /* help */
print_usage (progname);
exit (STATE_UNKNOWN);
case 'h': /* help */
print_help (progname);
exit (STATE_OK);
case 'V': /* version */
print_revision (progname, "$Revision$");
exit (STATE_OK);
case 'c': /* critical threshold */
if (!is_intnonneg (optarg)) {
printf ("%s: critical threshold must be an integer: %s\n",
progname, optarg);
print_usage (progname);
exit (STATE_UNKNOWN);
}
crit = atoi (optarg);
break;
case 'w': /* warning threshold */
if (!is_intnonneg (optarg)) {
printf ("%s: warning threshold must be an integer: %s\n",
progname, optarg);
print_usage (progname);
exit (STATE_UNKNOWN);
}
warn = atoi (optarg);
break;
case 'C': /* command name */
proc = optarg;
break;
}
}
c = optind;
if (warn == -1) {
if (!is_intnonneg (argv[c])) {
printf ("%s: critical threshold must be an integer: %s\n",
progname, argv[c]);
print_usage (progname);
exit (STATE_UNKNOWN);
}
warn = atoi (argv[c++]);
}
if (crit == -1) {
if (!is_intnonneg (argv[c])) {
printf ("%s: critical threshold must be an integer: %s\n",
progname, argv[c]);
print_usage (progname);
exit (STATE_UNKNOWN);
}
crit = atoi (argv[c++]);
}
if (proc == NULL)
proc = argv[c];
return c;
}
void
print_usage (const char *cmd)
{
printf ("Usage: %s -w <wsize> -c <csize> [-C command]\n"
" %s --help\n" " %s --version\n", cmd, cmd, cmd);
}
void
print_help (const char *cmd)
{
print_revision ("check_vsz", "$Revision$");
printf
("Copyright (c) 2000 Karl DeBisschop <kdebiss@alum.mit.edu>\n\n"
"This plugin checks the image size of a running program and returns an\n"
"error if the number is above either of the thresholds given.\n\n");
print_usage (cmd);
printf
("\nOptions:\n"
" -h, --help\n"
" Print detailed help\n"
" -V, --version\n"
" Print version numbers and license information\n"
" -w, --warning=INTEGER\n"
" Program image size necessary to cause a WARNING state\n"
" -c, --critical=INTEGER\n"
" Program image size necessary to cause a CRITICAL state\n"
" -C, --command=STRING\n" " Program to search for [optional]\n");
}