summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configure.in159
-rw-r--r--plugins/Makefile.am4
-rw-r--r--plugins/check_nagios.c5
-rw-r--r--plugins/check_procs.c362
-rw-r--r--plugins/check_vsz.c250
5 files changed, 307 insertions, 473 deletions
diff --git a/configure.in b/configure.in
index 18eefe6..2a0120f 100644
--- a/configure.in
+++ b/configure.in
@@ -622,13 +622,9 @@ dnl STAT UCOMM VSZ RSS USER UID PPID COMMAND
622if ps -weo 'stat comm vsz rss user uid ppid args' 2>/dev/null | \ 622if ps -weo 'stat comm vsz rss user uid ppid args' 2>/dev/null | \
623 egrep -i ["^ *S[TAUES]* +[UCOMDNA]+ +[VSIZE]+ +R[S]+ +U[SER]+ +U[ID]+ +P[PID]+ +[RGSCOMDNA]+"] >/dev/null 623 egrep -i ["^ *S[TAUES]* +[UCOMDNA]+ +[VSIZE]+ +R[S]+ +U[SER]+ +U[ID]+ +P[PID]+ +[RGSCOMDNA]+"] >/dev/null
624then 624then
625 ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]" 625 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
626 ac_cv_ps_command="$PATH_TO_PS -weo 'stat uid ppid comm args'" 626 ac_cv_ps_command="$PATH_TO_PS -weo 'stat uid ppid vsz rss pcpu comm args'"
627 ac_cv_ps_format="%s %d %d %s %n" 627 ac_cv_ps_format="%s %d %d %s %n"
628 ac_cv_vsz_command="$PATH_TO_PS -weo 'vsz comm'"
629 ac_cv_vsz_format="%d %s"
630 ac_cv_rss_command="$PATH_TO_PS -weo 'rss comm'"
631 ac_cv_rss_format="%d %s"
632 EXTRAS="$EXTRAS check_nagios" 628 EXTRAS="$EXTRAS check_nagios"
633 AC_MSG_RESULT([$ac_cv_ps_command]) 629 AC_MSG_RESULT([$ac_cv_ps_command])
634 630
@@ -636,13 +632,9 @@ dnl FreeBSD
636elif ps waxco 'state command vsz rss uid user ppid' 2>/dev/null | \ 632elif ps waxco 'state command vsz rss uid user ppid' 2>/dev/null | \
637 egrep -i ["^STAT +COMMAND +VSZ +RSS +UID +USER +PPID"] >/dev/null 633 egrep -i ["^STAT +COMMAND +VSZ +RSS +UID +USER +PPID"] >/dev/null
638then 634then
639 ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]" 635 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
640 ac_cv_ps_command="$PATH_TO_PS waxco 'state uid ppid command command'" 636 ac_cv_ps_command="$PATH_TO_PS waxco 'state uid ppid vsz rss pcpu command command'"
641 ac_cv_ps_format="%s %d %d %s %n" 637 ac_cv_ps_format="%s %d %d %s %n"
642 ac_cv_vsz_command="$PATH_TO_PS waxco 'vsz command'"
643 ac_cv_vsz_format="%d %s"
644 ac_cv_rss_command="$PATH_TO_PS waxco 'rss command'"
645 ac_cv_rss_format="%d %s"
646 EXTRAS="$EXTRAS check_nagios" 638 EXTRAS="$EXTRAS check_nagios"
647 AC_MSG_RESULT([$ac_cv_ps_command]) 639 AC_MSG_RESULT([$ac_cv_ps_command])
648 640
@@ -650,13 +642,9 @@ dnl BSD-like mode in RH 6.1
650elif ps waxno 'state comm vsz rss uid user ppid args' 2>/dev/null | \ 642elif ps waxno 'state comm vsz rss uid user ppid args' 2>/dev/null | \
651 egrep -i ["^S +COMMAND +VSZ +RSS +UID +USER +PPID +[RGSCOMDNA]+"] >/dev/null 643 egrep -i ["^S +COMMAND +VSZ +RSS +UID +USER +PPID +[RGSCOMDNA]+"] >/dev/null
652then 644then
653 ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]" 645 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
654 ac_cv_ps_command="$PATH_TO_PS waxno 'state uid ppid comm args'" 646 ac_cv_ps_command="$PATH_TO_PS waxno 'state uid ppid vsz rss pcpu comm args'"
655 ac_cv_ps_format="%s %d %d %s %n" 647 ac_cv_ps_format="%s %d %d %s %n"
656 ac_cv_vsz_command="$PATH_TO_PS waxno 'vsz comm'"
657 ac_cv_vsz_format="%d %s"
658 ac_cv_rss_command="$PATH_TO_PS waxno 'rss comm'"
659 ac_cv_rss_format="%d %s"
660 EXTRAS="$EXTRAS check_nagios" 648 EXTRAS="$EXTRAS check_nagios"
661 AC_MSG_RESULT([$ac_cv_ps_command]) 649 AC_MSG_RESULT([$ac_cv_ps_command])
662 650
@@ -665,13 +653,9 @@ dnl F UID PID PPID CP PRI NI SZ RSS WCHAN STAT TT TIME COMMAND
665elif ps -laxnwww 2>/dev/null | \ 653elif ps -laxnwww 2>/dev/null | \
666 egrep -i ["^ *F(LAGS)? +UID +PID +PPID +CP +PRI +NI +(SZ)|(VSZ)|(SIZE) +RSS +WCHAN +STAT? +TTY? +TIME +COMMAND"] >/dev/null 654 egrep -i ["^ *F(LAGS)? +UID +PID +PPID +CP +PRI +NI +(SZ)|(VSZ)|(SIZE) +RSS +WCHAN +STAT? +TTY? +TIME +COMMAND"] >/dev/null
667then 655then
668 ac_cv_ps_varlist="[&procuid,&procppid,procstat,&pos,procprog]" 656 ac_cv_ps_varlist="[&procuid,&procppid,&procvsz,&procrss,procstat,&pos,procprog]"
669 ac_cv_ps_command="$PATH_TO_PS -laxnwww" 657 ac_cv_ps_command="$PATH_TO_PS -laxnwww"
670 ac_cv_ps_format="%*s %d %*s %d %*s %*s %*s %*s %*s %*s %s %*s %*s %n%s" 658 ac_cv_ps_format="%*s %d %*s %d %*s %*s %*s %d %d %*s %s %*s %*s %n%s"
671 ac_cv_vsz_command="$PATH_TO_PS laxnwww"
672 ac_cv_vsz_format="%*s %*s %*s %*s %*s %*s %*s %d"
673 ac_cv_rss_command="$PATH_TO_PS laxnwww"
674 ac_cv_rss_format="%*s %*s %*s %*s %*s %*s %*s %*s %d"
675 EXTRAS="$EXTRAS check_nagios" 659 EXTRAS="$EXTRAS check_nagios"
676 AC_MSG_RESULT([$ac_cv_ps_command]) 660 AC_MSG_RESULT([$ac_cv_ps_command])
677 661
@@ -682,13 +666,9 @@ dnl
682elif ps laxnwww 2>/dev/null | \ 666elif ps laxnwww 2>/dev/null | \
683 egrep -i ["^ *F(LAGS)? +UID +PID +PPID +PRI +NI +(VSZ)|(SIZE) +RSS +WCHAN +STAT? TTY +TIME +COMMAND"] >/dev/null 667 egrep -i ["^ *F(LAGS)? +UID +PID +PPID +PRI +NI +(VSZ)|(SIZE) +RSS +WCHAN +STAT? TTY +TIME +COMMAND"] >/dev/null
684then 668then
685 ac_cv_ps_varlist="[&procuid,&procppid,procstat,&pos,procprog]" 669 ac_cv_ps_varlist="[&procuid,&procppid,procstat,&procvsz,&procrss,&pos,procprog]"
686 ac_cv_ps_command="$PATH_TO_PS laxnwww" 670 ac_cv_ps_command="$PATH_TO_PS laxnwww"
687 ac_cv_ps_format="%*s %d %*s %d %*s %*s %*s %*s %*s %s %*s %*s %n%s" 671 ac_cv_ps_format="%*s %d %*s %d %*s %*s %d %d %*s %s %*s %*s %n%s"
688 ac_cv_vsz_command="$PATH_TO_PS laxnwww"
689 ac_cv_vsz_format="%*s %*s %*s %*s %*s %*s %d"
690 ac_cv_rss_command="$PATH_TO_PS laxnwww"
691 ac_cv_rss_format="%*s %*s %*s %*s %*s %*s %*s %d"
692 EXTRAS="$EXTRAS check_nagios" 672 EXTRAS="$EXTRAS check_nagios"
693 AC_MSG_RESULT([$ac_cv_ps_command]) 673 AC_MSG_RESULT([$ac_cv_ps_command])
694 674
@@ -696,13 +676,9 @@ dnl OpenBSD (needs to come early because -exo appears to work, but does not give
696elif ps -axo 'stat comm vsz rss user uid ppid args' 2>/dev/null | \ 676elif ps -axo 'stat comm vsz rss user uid ppid args' 2>/dev/null | \
697 egrep -i ["^ *S[TAUES]* +[UCOMDNA]+ +[VSIZE]+ +R[S]+ +U[SER]+ +U[ID]+ +P[PID]+ +[RGSCOMDNA]+"] >/dev/null 677 egrep -i ["^ *S[TAUES]* +[UCOMDNA]+ +[VSIZE]+ +R[S]+ +U[SER]+ +U[ID]+ +P[PID]+ +[RGSCOMDNA]+"] >/dev/null
698then 678then
699 ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]" 679 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
700 ac_cv_ps_command="$PATH_TO_PS -axo 'stat uid ppid comm args'" 680 ac_cv_ps_command="$PATH_TO_PS -axo 'stat uid ppid vsz rss pcpu comm args'"
701 ac_cv_ps_format="%s %d %d %s %n" 681 ac_cv_ps_format="%s %d %d %s %n"
702 ac_cv_vsz_command="$PATH_TO_PS -axo 'vsz comm'"
703 ac_cv_vsz_format="%d %s"
704 ac_cv_rss_command="$PATH_TO_PS -axo 'rss comm'"
705 ac_cv_rss_format="%d %s"
706 EXTRAS="$EXTRAS check_nagios" 682 EXTRAS="$EXTRAS check_nagios"
707 AC_MSG_RESULT([$ac_cv_ps_command]) 683 AC_MSG_RESULT([$ac_cv_ps_command])
708 684
@@ -710,65 +686,45 @@ dnl AIX 4.3.3 - needs verification. This works for Tru64 - needs %*[ +] in PS_FO
710elif ps -ao 'stat comm vsz rss user uid ppid args' 2>/dev/null | \ 686elif ps -ao 'stat comm vsz rss user uid ppid args' 2>/dev/null | \
711 egrep -i ["^ *S[TAUES]* +[UCOMDNA]+ +[VSIZE]+ +R[S]+ +U[SER]+ +U[ID]+ +P[PID]+ +[RGSCOMDNA]+"] >/dev/null 687 egrep -i ["^ *S[TAUES]* +[UCOMDNA]+ +[VSIZE]+ +R[S]+ +U[SER]+ +U[ID]+ +P[PID]+ +[RGSCOMDNA]+"] >/dev/null
712then 688then
713 ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]" 689 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
714 ac_cv_ps_command="$PATH_TO_PS -ao 'stat uid ppid comm args'" 690 ac_cv_ps_command="$PATH_TO_PS -ao 'stat uid ppid vsz rss pcpu comm args'"
715 ac_cv_ps_format="[["%s%*[ +] %d %d %s %n"]]" 691 ac_cv_ps_format="[["%s%*[ +] %d %d %s %n"]]"
716 ac_cv_vsz_command="$PATH_TO_PS -ao 'vsz comm'"
717 ac_cv_vsz_format="%d %s"
718 ac_cv_rss_command="$PATH_TO_PS -ao 'rss comm'"
719 ac_cv_rss_format="%d %s"
720 EXTRAS="$EXTRAS check_nagios" 692 EXTRAS="$EXTRAS check_nagios"
721 AC_MSG_RESULT([$ac_cv_ps_command]) 693 AC_MSG_RESULT([$ac_cv_ps_command])
722 694
723elif ps -eo 's comm vsz rss user uid ppid args' 2>/dev/null | \ 695elif ps -eo 's comm vsz rss user uid ppid args' 2>/dev/null | \
724 egrep -i ["^S[TAUES]* +C[OMDNA]+ +[VSIZE]+ +U[SER]+ +U[ID]+ +P[PID]+ +[RGSCOMDNA]+"] >/dev/null 696 egrep -i ["^S[TAUES]* +C[OMDNA]+ +[VSIZE]+ +U[SER]+ +U[ID]+ +P[PID]+ +[RGSCOMDNA]+"] >/dev/null
725then 697then
726 ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]" 698 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
727 ac_cv_ps_command="$PATH_TO_PS -eo 's uid ppid comm args'" 699 ac_cv_ps_command="$PATH_TO_PS -eo 's uid ppid vsz rss pcpu comm args'"
728 ac_cv_ps_format="%s %d %d %s %n" 700 ac_cv_ps_format="%s %d %d %s %n"
729 ac_cv_vsz_command="$PATH_TO_PS -eo 'vsz comm'"
730 ac_cv_vsz_format="%d %s"
731 ac_cv_rss_command="$PATH_TO_PS -eo 'rss comm'"
732 ac_cv_rss_format="%d %s"
733 EXTRAS="$EXTRAS check_nagios" 701 EXTRAS="$EXTRAS check_nagios"
734 AC_MSG_RESULT([$ac_cv_ps_command]) 702 AC_MSG_RESULT([$ac_cv_ps_command])
735 703
736elif ps -Ao 's comm vsz rss uid user ppid args' 2>/dev/null | \ 704elif ps -Ao 's comm vsz rss uid user ppid args' 2>/dev/null | \
737 egrep -i ["^S[TAUES]* +C[OMDNA]+ +V[SIZE]+ +RSS +UID +USER +PPID +[RGSCOMDNA]+"] >/dev/null 705 egrep -i ["^S[TAUES]* +C[OMDNA]+ +V[SIZE]+ +RSS +UID +USER +PPID +[RGSCOMDNA]+"] >/dev/null
738then 706then
739 ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]" 707 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
740 ac_cv_ps_command="$PATH_TO_PS -Ao 's uid ppid comm args'" 708 ac_cv_ps_command="$PATH_TO_PS -Ao 's uid ppid vsz rss pcpu comm args'"
741 ac_cv_ps_format="%s %d %d %s %n" 709 ac_cv_ps_format="%s %d %d %s %n"
742 ac_cv_vsz_command="$PATH_TO_PS -Ao 'vsz comm'"
743 ac_cv_vsz_format="%d %s"
744 ac_cv_rss_command="$PATH_TO_PS -Ao 'rss comm'"
745 ac_cv_rss_format="%d %s"
746 EXTRAS="$EXTRAS check_nagios" 710 EXTRAS="$EXTRAS check_nagios"
747 AC_MSG_RESULT([$ac_cv_ps_command]) 711 AC_MSG_RESULT([$ac_cv_ps_command])
748 712
749elif ps -Ao 'status comm vsz rss uid user ppid args' 2>/dev/null | \ 713elif ps -Ao 'status comm vsz rss uid user ppid args' 2>/dev/null | \
750 egrep -i ["^S[TAUES]* +C[OMDNA]+ +V[SIZE]+ +RSS +UID +USER +PPID +[RGSCOMDNA]+"] >/dev/null 714 egrep -i ["^S[TAUES]* +C[OMDNA]+ +V[SIZE]+ +RSS +UID +USER +PPID +[RGSCOMDNA]+"] >/dev/null
751then 715then
752 ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]" 716 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
753 ac_cv_ps_command="$PATH_TO_PS -Ao 'status uid ppid comm args'" 717 ac_cv_ps_command="$PATH_TO_PS -Ao 'status uid ppid vsz rss pcpu comm args'"
754 ac_cv_ps_format="%s %d %d %s %n" 718 ac_cv_ps_format="%s %d %d %s %n"
755 ac_cv_vsz_command="$PATH_TO_PS -Ao 'vsz comm'"
756 ac_cv_vsz_format="%d %s"
757 ac_cv_rss_command="$PATH_TO_PS -Ao 'rss comm'"
758 ac_cv_rss_format="%d %s"
759 EXTRAS="$EXTRAS check_nagios" 719 EXTRAS="$EXTRAS check_nagios"
760 AC_MSG_RESULT([$ac_cv_ps_command]) 720 AC_MSG_RESULT([$ac_cv_ps_command])
761 721
762elif ps -Ao 'state comm vsz rss uid user ppid args' 2>/dev/null | \ 722elif ps -Ao 'state comm vsz rss uid user ppid args' 2>/dev/null | \
763 egrep -i ["^S[TAUES]* +C[OMDNA]+ +V[SIZE]+ +RSS +UID +USER +PPID +[RGSCOMDNA]+"] >/dev/null 723 egrep -i ["^S[TAUES]* +C[OMDNA]+ +V[SIZE]+ +RSS +UID +USER +PPID +[RGSCOMDNA]+"] >/dev/null
764then 724then
765 ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]" 725 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
766 ac_cv_ps_command="$PATH_TO_PS -Ao 'state uid ppid comm args'" 726 ac_cv_ps_command="$PATH_TO_PS -Ao 'state uid ppid vsz rss pcpu comm args'"
767 ac_cv_ps_format="%s %d %d %s %n" 727 ac_cv_ps_format="%s %d %d %s %n"
768 ac_cv_vsz_command="$PATH_TO_PS -Ao 'vsz comm'"
769 ac_cv_vsz_format="%d %s"
770 ac_cv_rss_command="$PATH_TO_PS -Ao 'rss comm'"
771 ac_cv_rss_format="%d %s"
772 EXTRAS="$EXTRAS check_nagios" 728 EXTRAS="$EXTRAS check_nagios"
773 AC_MSG_RESULT([$ac_cv_ps_command]) 729 AC_MSG_RESULT([$ac_cv_ps_command])
774 730
@@ -776,13 +732,9 @@ dnl wonder who takes state instead of stat
776elif ps -ao 'state command vsz rss user ppid args' 2>/dev/null | \ 732elif ps -ao 'state command vsz rss user ppid args' 2>/dev/null | \
777 egrep -i ["^S[TAUES]* +C[OMDNA]+ +V[SIZE]+ +RSS +UID +USER +PPID +[RGSCOMDNA]+"] >/dev/null 733 egrep -i ["^S[TAUES]* +C[OMDNA]+ +V[SIZE]+ +RSS +UID +USER +PPID +[RGSCOMDNA]+"] >/dev/null
778then 734then
779 ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]" 735 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&procpcpu,procprog,&pos]"
780 ac_cv_ps_command="$PATH_TO_PS -ao 'state uid ppid command args'" 736 ac_cv_ps_command="$PATH_TO_PS -ao 'state uid ppid vsz rss pcpu command args'"
781 ac_cv_ps_format="%s %d %d %s %n" 737 ac_cv_ps_format="%s %d %d %s %n"
782 ac_cv_vsz_command="$PATH_TO_PS -ao 'vsz command'"
783 ac_cv_vsz_format="%d %s"
784 ac_cv_rss_command="$PATH_TO_PS -ao 'rss command'"
785 ac_cv_rss_format="%d %s"
786 EXTRAS="$EXTRAS check_nagios" 738 EXTRAS="$EXTRAS check_nagios"
787 AC_MSG_RESULT([$ac_cv_ps_command]) 739 AC_MSG_RESULT([$ac_cv_ps_command])
788 740
@@ -790,13 +742,9 @@ dnl IRIX 53
790elif ps -el 2>/dev/null | \ 742elif ps -el 2>/dev/null | \
791 egrep -i ["^ *F +S +UID +PID +PPID +C +PRI +NI +P +SZ +RSS +WCHAN +TTY +TIME +[RGSCOMDNA]+"] >/dev/null 743 egrep -i ["^ *F +S +UID +PID +PPID +C +PRI +NI +P +SZ +RSS +WCHAN +TTY +TIME +[RGSCOMDNA]+"] >/dev/null
792then 744then
793 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&pos,procprog]" 745 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&procvsz,&procrss,&pos,procprog]"
794 ac_cv_ps_command="$PATH_TO_PS -el" 746 ac_cv_ps_command="$PATH_TO_PS -el"
795 ac_cv_ps_format="%*s %s %d %*s %d %*s %*s %*s %*s %*s %*s %*s %*s %*s %n%s" 747 ac_cv_ps_format="%*s %s %d %*s %d %*s %*s %*s %*s %d %d %*s %*s %*s %n%s"
796 ac_cv_vsz_command="$PATH_TO_PS -el"
797 ac_cv_vsz_format="%*s %*s %*s %*s %d"
798 ac_cv_rss_command="$PATH_TO_PS -el"
799 ac_cv_rss_format="%*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %d"
800 AC_MSG_RESULT([$ac_cv_ps_command]) 748 AC_MSG_RESULT([$ac_cv_ps_command])
801 749
802dnl IRIX 63 750dnl IRIX 63
@@ -806,10 +754,6 @@ then
806 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&pos,procprog]" 754 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&pos,procprog]"
807 ac_cv_ps_command="$PATH_TO_PS -el" 755 ac_cv_ps_command="$PATH_TO_PS -el"
808 ac_cv_ps_format="%*s %s %d %*s %d %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %n%s" 756 ac_cv_ps_format="%*s %s %d %*s %d %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %n%s"
809 ac_cv_vsz_command="$PATH_TO_PS -el"
810 ac_cv_vsz_format="%*s %*s %*s %*s %d"
811 ac_cv_rss_command="$PATH_TO_PS -el"
812 ac_cv_rss_format="%*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %d"
813 AC_MSG_RESULT([$ac_cv_ps_command]) 757 AC_MSG_RESULT([$ac_cv_ps_command])
814 758
815dnl AIX 4.1: 759dnl AIX 4.1:
@@ -821,39 +765,28 @@ then
821 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&pos,procprog]" 765 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&pos,procprog]"
822 ac_cv_ps_command="$PATH_TO_PS -el" 766 ac_cv_ps_command="$PATH_TO_PS -el"
823 ac_cv_ps_format="%*s %s %d %*s %d %*s %*s %*s %*s %*s %*s %*s %*s %n%s" 767 ac_cv_ps_format="%*s %s %d %*s %d %*s %*s %*s %*s %*s %*s %*s %*s %n%s"
824 ac_cv_vsz_command="$PATH_TO_PS -el"
825 ac_cv_vsz_format="%*s %*s %*s %*s %*s %*s %*s %*s %*s %d"
826 ac_cv_rss_command="$PATH_TO_PS -el"
827 ac_cv_rss_format="%*s %*s %*s %*s %*s %*s %*s %*s %*s %d"
828 AC_MSG_RESULT([$ac_cv_ps_command]) 768 AC_MSG_RESULT([$ac_cv_ps_command])
829 769
830dnl AIX? 770dnl AIX?
831elif ps glaxen 2>/dev/null | \ 771elif ps glaxen 2>/dev/null | \
832 egrep -i ["^ *F +UID +PID +PPID +PRI +NI +VSZ +RSS +WCHAN +STAT +TTY +TIME +COMMAND"] >/dev/null 772 egrep -i ["^ *F +UID +PID +PPID +PRI +NI +VSZ +RSS +WCHAN +STAT +TTY +TIME +COMMAND"] >/dev/null
833then 773then
834 ac_cv_ps_varlist="[&procuid,&procppid,procstat,&pos,procprog]" 774 ac_cv_ps_varlist="[&procuid,&procppid,&procvsz,&procrss,procstat,&pos,procprog]"
835 ac_cv_ps_command="$PATH_TO_PS glaxen" 775 ac_cv_ps_command="$PATH_TO_PS glaxen"
836 ac_cv_ps_format="%*s %d %*s %d %*s %*s %*s %*s %*s %s %*s %*s %n%s" 776 ac_cv_ps_format="%*s %d %*s %d %*s %*s %d %d %*s %s %*s %*s %n%s"
837 ac_cv_vsz_command="$PATH_TO_PS glaxen"
838 ac_cv_vsz_format="%*s %*s %*s %*s %*s %*s %d"
839 ac_cv_rss_command="$PATH_TO_PS glaxen"
840 ac_cv_rss_format="%*s %*s %*s %*s %*s %*s %*s %d"
841 AC_MSG_RESULT([$ac_cv_ps_command]) 777 AC_MSG_RESULT([$ac_cv_ps_command])
842 778
843dnl MacOSX / Darwin 779dnl MacOSX / Darwin
844dnl TODO: MacOSX has commands with spaces which will cause problems to PS_FORMAT 780dnl TODO: MacOSX has commands with spaces which will cause problems to PS_FORMAT
845dnl STAT VSZ RSS UID USER PPID UCOMM COMMAND 781dnl Some truncation will happen in UCOMM column
846dnl Ss 1308 272 0 root 0 init /sbin/init 782dnl STAT VSZ RSS UID PPID %CPU UCOMM COMMAND
847elif ps waxo 'state vsz rss uid user ppid ucomm command' 2>/dev/null | \ 783dnl Ss 52756 22496 501 1 6.9 Window Manager /System/Library/CoreServices/WindowServer -daemon
848 egrep -i ["^STAT +VSZ +RSS +UID +USER +PPID +UCOMM +COMMAND"] >/dev/null 784elif ps wwaxo 'state vsz rss uid ppid pcpu ucomm command' 2>/dev/null | \
785 egrep -i ["^STAT +VSZ +RSS +UID +PPID +%CPU +UCOMM +COMMAND"] >/dev/null
849then 786then
850 ac_cv_ps_varlist="[procstat,&procuid,&procppid,procprog,&pos]" 787 ac_cv_ps_command="$PATH_TO_PS wwaxo 'state vsz rss uid ppid pcpu ucomm command'"
851 ac_cv_ps_command="$PATH_TO_PS waxo 'state uid ppid ucomm command'" 788 ac_cv_ps_varlist="[procstat,&procvsz,&procrss,&procuid,&procppid,&procpcpu,procprog,&pos]"
852 ac_cv_ps_format="%s %d %d %s %n" 789 ac_cv_ps_format="%s %d %d %d %d %f %s %n"
853 ac_cv_vsz_command="$PATH_TO_PS waxco 'vsz command'"
854 ac_cv_vsz_format="%d %s"
855 ac_cv_rss_command="$PATH_TO_PS waxco 'rss command'"
856 ac_cv_rss_format="%d %s"
857 EXTRAS="$EXTRAS check_nagios" 790 EXTRAS="$EXTRAS check_nagios"
858 AC_MSG_RESULT([$ac_cv_ps_command]) 791 AC_MSG_RESULT([$ac_cv_ps_command])
859 792
@@ -864,12 +797,12 @@ then
864 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&pos,procprog]" 797 ac_cv_ps_varlist="[procstat,&procuid,&procppid,&pos,procprog]"
865 ac_cv_ps_command="$PATH_TO_PS -Al" 798 ac_cv_ps_command="$PATH_TO_PS -Al"
866 ac_cv_ps_format="%*s %s %d %*s %d %*s %*s %*s %*s %*s %*s %*s %*s %*s %n%s" 799 ac_cv_ps_format="%*s %s %d %*s %d %*s %*s %*s %*s %*s %*s %*s %*s %*s %n%s"
867 if ps -Ao 'vsz comm' 2>/dev/null | \ 800 #if ps -Ao 'vsz comm' 2>/dev/null | \
868 egrep -i ["^ *VSZ +COMMAND"] >/dev/null 801 # egrep -i ["^ *VSZ +COMMAND"] >/dev/null
869 then 802 #then
870 ac_cv_vsz_command="$PATH_TO_PS -Ao 'vsz comm'" 803 # ac_cv_vsz_command="$PATH_TO_PS -Ao 'vsz comm'"
871 ac_cv_vsz_format="%*s %d" 804 # ac_cv_vsz_format="%*s %d"
872 fi 805 #fi
873 AC_MSG_RESULT([$ac_cv_ps_command]) 806 AC_MSG_RESULT([$ac_cv_ps_command])
874 807
875else 808else
@@ -882,14 +815,6 @@ AC_DEFINE_UNQUOTED(PS_COMMAND,"$ac_cv_ps_command",
882 [Verbatim command to execute for ps in check_procs]) 815 [Verbatim command to execute for ps in check_procs])
883AC_DEFINE_UNQUOTED(PS_FORMAT,"$ac_cv_ps_format", 816AC_DEFINE_UNQUOTED(PS_FORMAT,"$ac_cv_ps_format",
884 [Format string for scanning ps output in check_procs]) 817 [Format string for scanning ps output in check_procs])
885AC_DEFINE_UNQUOTED(VSZ_COMMAND,"$ac_cv_vsz_command",
886 [Verbatim command to execute for ps in check_vsz])
887AC_DEFINE_UNQUOTED(VSZ_FORMAT,"$ac_cv_vsz_format",
888 [Format string for scanning ps output in check_vsz])
889AC_DEFINE_UNQUOTED(RSS_COMMAND,"$ac_cv_rss_command",
890 [Verbatim command to execute for ps in check_rss])
891AC_DEFINE_UNQUOTED(RSS_FORMAT,"$ac_cv_rss_format",
892 [Format string for scanning ps output in check_rss])
893 818
894AC_PATH_PROG(PATH_TO_DF,df) 819AC_PATH_PROG(PATH_TO_DF,df)
895AC_PATH_PROG(PATH_TO_BDF,bdf) 820AC_PATH_PROG(PATH_TO_BDF,bdf)
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index a884b45..0692cd2 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -7,7 +7,7 @@ INCLUDES = -I.. -I$(top_srcdir)/lib @LDAPINCLUDE@ @PGINCLUDE@ @SSLINCLUDE@
7libexec_PROGRAMS = check_disk check_dummy check_http check_load \ 7libexec_PROGRAMS = check_disk check_dummy check_http check_load \
8 check_mrtg check_mrtgtraf check_nwstat check_overcr check_ping \ 8 check_mrtg check_mrtgtraf check_nwstat check_overcr check_ping \
9 check_procs check_real check_smtp check_ssh check_tcp check_time \ 9 check_procs check_real check_smtp check_ssh check_tcp check_time \
10 check_udp check_ups check_users check_vsz negate urlize \ 10 check_udp check_ups check_users negate urlize \
11 @EXTRAS@ 11 @EXTRAS@
12 12
13EXTRA_PROGRAMS = check_mysql check_radius check_pgsql check_snmp check_hpjd \ 13EXTRA_PROGRAMS = check_mysql check_radius check_pgsql check_snmp check_hpjd \
@@ -68,7 +68,6 @@ check_time_LDADD = $(NETLIBS)
68check_udp_LDADD = $(NETLIBS) 68check_udp_LDADD = $(NETLIBS)
69check_ups_LDADD = $(NETLIBS) 69check_ups_LDADD = $(NETLIBS)
70check_users_LDADD = $(BASEOBJS) popen.o 70check_users_LDADD = $(BASEOBJS) popen.o
71check_vsz_LDADD = $(BASEOBJS) popen.o
72check_by_ssh_LDADD = $(NETLIBS) popen.o 71check_by_ssh_LDADD = $(NETLIBS) popen.o
73negate_LDADD = $(BASEOBJS) popen.o 72negate_LDADD = $(BASEOBJS) popen.o
74urlize_LDADD = $(BASEOBJS) popen.o 73urlize_LDADD = $(BASEOBJS) popen.o
@@ -104,7 +103,6 @@ check_time_DEPENDENCIES = check_time.c $(NETOBJS) $(DEPLIBS)
104check_udp_DEPENDENCIES = check_udp.c $(NETOBJS) $(DEPLIBS) 103check_udp_DEPENDENCIES = check_udp.c $(NETOBJS) $(DEPLIBS)
105check_ups_DEPENDENCIES = check_ups.c $(NETOBJS) $(DEPLIBS) 104check_ups_DEPENDENCIES = check_ups.c $(NETOBJS) $(DEPLIBS)
106check_users_DEPENDENCIES = check_users.c $(BASEOBJS) popen.o $(DEPLIBS) 105check_users_DEPENDENCIES = check_users.c $(BASEOBJS) popen.o $(DEPLIBS)
107check_vsz_DEPENDENCIES = check_vsz.c $(BASEOBJS) popen.o $(DEPLIBS)
108check_by_ssh_DEPENDENCIES = check_by_ssh.c $(NETOBJS) popen.o $(DEPLIBS) 106check_by_ssh_DEPENDENCIES = check_by_ssh.c $(NETOBJS) popen.o $(DEPLIBS)
109negate_DEPENDENCIES = negate.c $(BASEOBJS) popen.o $(DEPLIBS) 107negate_DEPENDENCIES = negate.c $(BASEOBJS) popen.o $(DEPLIBS)
110urlize_DEPENDENCIES = urlize.c $(BASEOBJS) popen.o $(DEPLIBS) 108urlize_DEPENDENCIES = urlize.c $(BASEOBJS) popen.o $(DEPLIBS)
diff --git a/plugins/check_nagios.c b/plugins/check_nagios.c
index 083b502..64a828b 100644
--- a/plugins/check_nagios.c
+++ b/plugins/check_nagios.c
@@ -55,6 +55,9 @@ main (int argc, char **argv)
55 FILE *fp; 55 FILE *fp;
56 int procuid = 0; 56 int procuid = 0;
57 int procppid = 0; 57 int procppid = 0;
58 int procvsz = 0;
59 int procrss = 0;
60 float procpcpu = 0;
58 char procstat[8]; 61 char procstat[8];
59 char procprog[MAX_INPUT_BUFFER]; 62 char procprog[MAX_INPUT_BUFFER];
60 char *procargs; 63 char *procargs;
@@ -106,7 +109,7 @@ main (int argc, char **argv)
106 /* count the number of matching Nagios processes... */ 109 /* count the number of matching Nagios processes... */
107 while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { 110 while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) {
108 cols = sscanf (input_buffer, PS_FORMAT, PS_VARLIST); 111 cols = sscanf (input_buffer, PS_FORMAT, PS_VARLIST);
109 if ( cols >= 4 ) { 112 if ( cols >= 6 ) {
110 asprintf (&procargs, "%s", input_buffer + pos); 113 asprintf (&procargs, "%s", input_buffer + pos);
111 strip (procargs); 114 strip (procargs);
112 115
diff --git a/plugins/check_procs.c b/plugins/check_procs.c
index 29f86be..2cf550c 100644
--- a/plugins/check_procs.c
+++ b/plugins/check_procs.c
@@ -39,11 +39,64 @@ const char *progname = "check_procs";
39#define COPYRIGHT "1999-2002" 39#define COPYRIGHT "1999-2002"
40#define AUTHOR "Ethan Galstad" 40#define AUTHOR "Ethan Galstad"
41#define EMAIL "nagios@nagios.org" 41#define EMAIL "nagios@nagios.org"
42#define SUMMARY "Check the number of currently running processes and generates WARNING or\n\ 42#define SUMMARY "\
43CRITICAL states if the process count is outside the specified threshold\n\ 43Checks all processes and generates WARNING or CRITICAL states if the specified\n\
44ranges. The process count can be filtered by process owner, parent process\n\ 44metric is outside the required threshold ranges. The metric defaults to number\n\
45PID, current state (e.g., 'Z'), or may be the total number of running\n\ 45of processes. Search filters can be applied to limit the processes to check.\n"
46processes\n" 46
47#define OPTIONS "\
48-w <range> -c <range> [-m metric]\n\
49 [-s state] [-p ppid] [-u user] [-r rss] [-z vsz] [-P %cpu]\n\
50 [-a argument-array] [-C command] [-v]"
51
52#define LONGOPTIONS "\
53Required Arguments:\n\
54 -w, --warning=RANGE\n\
55 Generate warning state if metric is outside this range\n\
56 -c, --critical=RANGE\n\
57 Generate critical state if metric is outside this range\n\
58Optional Arguments:\n\
59 -m, --metric=TYPE\n\
60 Check thresholds against metric. Valid types:\n\
61 PROCS - number of processes (default)\n\
62 VSZ - virtual memory size\n\
63 RSS - resident set memory size\n\
64 CPU - percentage cpu\n\
65 -v, --verbose\n\
66 Extra information. Up to 3 verbosity levels\n\
67Optional Filters:\n\
68 -s, --state=STATUSFLAGS\n\
69 Only scan for processes that have, in the output of `ps`, one or\n\
70 more of the status flags you specify (for example R, Z, S, RS,\n\
71 RSZDT, plus others based on the output of your 'ps' command).\n\
72 -p, --ppid=PPID\n\
73 Only scan for children of the parent process ID indicated.\n\
74 -z, --vsz=VSZ\n\
75 Only scan for processes with vsz higher than indicated.\n\
76 -r, --rss=RSS\n\
77 Only scan for processes with rss higher than indicated.\n\
78 -P, --pcpu=PCPU\n\
79 Only scan for processes with pcpu higher than indicated.\n\
80 -u, --user=USER\n\
81 Only scan for processes with user name or ID indicated.\n\
82 -a, --argument-array=STRING\n\
83 Only scan for ARGS that match up to the length of the given STRING.\n\
84 -C, --command=COMMAND\n\
85 Only scan for exact matches to the named COMMAND.\n\
86\n\
87RANGEs are specified 'min:max' or 'min:' or ':max' (or 'max'). If\n\
88specified 'max:min', a warning status will be generated if the\n\
89count is inside the specified range\n"
90
91#define EXAMPLES "\
92 check_procs -w 2:2 -c 2:1024 -C portsentry\n\
93 Warning if not two processes with command name portsentry. Critical\n\
94 if < 2 or > 1024 processes\n\
95 check_procs -w 10 -a '/usr/local/bin/perl' -u root\n\
96 Warning alert if > 10 processes with command arguments containing \n\
97 '/usr/local/bin/perl' and owned by root\n\
98 check_procs -w 50000 -c 100000 --metric=VSZ\n\
99 Alert if vsz of any processes over 50K or 100K\n"
47 100
48#include "config.h" 101#include "config.h"
49#include <pwd.h> 102#include <pwd.h>
@@ -55,6 +108,7 @@ int process_arguments (int, char **);
55int validate_arguments (void); 108int validate_arguments (void);
56void print_usage (void); 109void print_usage (void);
57void print_help (void); 110void print_help (void);
111int check_thresholds (int);
58 112
59int wmax = -1; 113int wmax = -1;
60int cmax = -1; 114int cmax = -1;
@@ -68,16 +122,30 @@ int options = 0; /* bitmask of filter criteria to test against */
68#define USER 8 122#define USER 8
69#define PROG 16 123#define PROG 16
70#define ARGS 32 124#define ARGS 32
71 125#define VSZ 64
72int verbose = FALSE; 126#define RSS 128
127#define PCPU 256
128
129/* Different metrics */
130int metric = 0;
131#define METRIC_PROCS 0
132#define METRIC_VSZ 1
133#define METRIC_RSS 2
134#define METRIC_CPU 3
135char *metric_name = "";
136
137int verbose = 0;
73int uid; 138int uid;
74int ppid; 139int ppid;
140int vsz;
141int rss;
142float pcpu;
75char *statopts = ""; 143char *statopts = "";
76char *prog = ""; 144char *prog = "";
77char *args = ""; 145char *args = "";
78char *fmt = ""; 146char *fmt = "";
147char *fails = "";
79char tmp[MAX_INPUT_BUFFER]; 148char tmp[MAX_INPUT_BUFFER];
80const char *zombie = "Z";
81 149
82int 150int
83main (int argc, char **argv) 151main (int argc, char **argv)
@@ -86,24 +154,35 @@ main (int argc, char **argv)
86 154
87 int procuid = 0; 155 int procuid = 0;
88 int procppid = 0; 156 int procppid = 0;
157 int procvsz = 0;
158 int procrss = 0;
159 float procpcpu = 0;
89 char procstat[8]; 160 char procstat[8];
90 char procprog[MAX_INPUT_BUFFER]; 161 char procprog[MAX_INPUT_BUFFER];
91 char *procargs; 162 char *procargs;
92 163
164 const char *zombie = "Z";
165
93 int resultsum = 0; /* bitmask of the filter criteria met by a process */ 166 int resultsum = 0; /* bitmask of the filter criteria met by a process */
94 int found = 0; /* counter for number of lines returned in `ps` output */ 167 int found = 0; /* counter for number of lines returned in `ps` output */
95 int procs = 0; /* counter for number of processes meeting filter criteria */ 168 int procs = 0; /* counter for number of processes meeting filter criteria */
96 int pos; /* number of spaces before 'args' in `ps` output */ 169 int pos; /* number of spaces before 'args' in `ps` output */
97 int cols; /* number of columns in ps output */ 170 int cols; /* number of columns in ps output */
171 int warn = 0; /* number of processes in warn state */
172 int crit = 0; /* number of processes in crit state */
173 int i;
98 174
99 int result = STATE_UNKNOWN; 175 int result = STATE_UNKNOWN;
100 176
177 asprintf (&metric_name, "PROCS");
178 metric = METRIC_PROCS;
179
101 if (process_arguments (argc, argv) == ERROR) 180 if (process_arguments (argc, argv) == ERROR)
102 usage ("Unable to parse command line\n"); 181 usage ("Unable to parse command line\n");
103 182
104 /* run the command */ 183 if (verbose >= 2)
105 if (verbose) 184 printf ("CMD: %s\n", PS_COMMAND);
106 printf ("%s\n", PS_COMMAND); 185
107 child_process = spopen (PS_COMMAND); 186 child_process = spopen (PS_COMMAND);
108 if (child_process == NULL) { 187 if (child_process == NULL) {
109 printf ("Could not open pipe: %s\n", PS_COMMAND); 188 printf ("Could not open pipe: %s\n", PS_COMMAND);
@@ -117,18 +196,22 @@ main (int argc, char **argv)
117 fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process); 196 fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process);
118 197
119 while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { 198 while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) {
199 strcpy(procprog,"");
200 asprintf(&procargs,"");
201
120 cols = sscanf (input_buffer, PS_FORMAT, PS_VARLIST); 202 cols = sscanf (input_buffer, PS_FORMAT, PS_VARLIST);
121 203
122 /* Zombie processes do not give a procprog command */ 204 /* Zombie processes do not give a procprog command */
205 /* - would they give other columns? */
123 if ( cols == 3 && strstr(procstat, zombie) ) { 206 if ( cols == 3 && strstr(procstat, zombie) ) {
124 strcpy(procprog, "");
125 cols = 4; 207 cols = 4;
126 } 208 }
127 if ( cols >= 4 ) { 209 if ( cols >= 7 ) {
128 found++; 210 found++;
129 resultsum = 0; 211 resultsum = 0;
130 asprintf (&procargs, "%s", input_buffer + pos); 212 asprintf (&procargs, "%s", input_buffer + pos);
131 strip (procargs); 213 strip (procargs);
214
132 if ((options & STAT) && (strstr (statopts, procstat))) 215 if ((options & STAT) && (strstr (statopts, procstat)))
133 resultsum |= STAT; 216 resultsum |= STAT;
134 if ((options & ARGS) && procargs && (strstr (procargs, args) == procargs)) 217 if ((options & ARGS) && procargs && (strstr (procargs, args) == procargs))
@@ -139,16 +222,43 @@ main (int argc, char **argv)
139 resultsum |= PPID; 222 resultsum |= PPID;
140 if ((options & USER) && (procuid == uid)) 223 if ((options & USER) && (procuid == uid))
141 resultsum |= USER; 224 resultsum |= USER;
142#ifdef DEBUG1 225 if ((options & VSZ) && (procvsz >= vsz))
143 if (procargs == NULL) 226 resultsum |= VSZ;
144 printf ("%d %d %d %s %s\n", procs, procuid, procppid, procstat, 227 if ((options & RSS) && (procrss >= rss))
145 procprog); 228 resultsum |= RSS;
146 else 229 if ((options & PCPU) && (procpcpu >= pcpu))
147 printf ("%d %d %d %s %s %s\n", procs, procuid, procppid, procstat, 230 resultsum |= PCPU;
148 procprog, procargs); 231
149#endif 232 if (verbose >= 3)
150 if (options == resultsum) 233 printf ("%d %d %d %d %d %.2f %s %s %s\n",
151 procs++; 234 procs, procuid, procvsz, procrss,
235 procppid, procpcpu, procstat, procprog, procargs);
236
237 /* Next line if filters not matched */
238 if (!(options == resultsum || options == ALL))
239 continue;
240
241 procs++;
242
243 if (metric == METRIC_VSZ)
244 i = check_thresholds (procvsz);
245 else if (metric == METRIC_RSS)
246 i = check_thresholds (procrss);
247 /* TODO? float thresholds for --metric=CPU */
248 else if (metric == METRIC_CPU)
249 i = check_thresholds ((int)procpcpu);
250
251 if (metric != METRIC_PROCS) {
252 if (i == STATE_WARNING) {
253 warn++;
254 asprintf (&fails, "%s%s%s", fails, (fails == "" ? "" : ", "), procprog);
255 }
256 if (i == STATE_CRITICAL) {
257 crit++;
258 asprintf (&fails, "%s%s%s", fails, (fails == "" ? "" : ", "), procprog);
259 }
260 result = max_state (result, i);
261 }
152 } 262 }
153 /* This should not happen */ 263 /* This should not happen */
154 else if (verbose) { 264 else if (verbose) {
@@ -172,65 +282,83 @@ main (int argc, char **argv)
172 result = max_state (result, STATE_WARNING); 282 result = max_state (result, STATE_WARNING);
173 } 283 }
174 284
175 if (options == ALL)
176 procs = found;
177
178 if (found == 0) { /* no process lines parsed so return STATE_UNKNOWN */ 285 if (found == 0) { /* no process lines parsed so return STATE_UNKNOWN */
179 printf ("Unable to read output\n"); 286 printf ("Unable to read output\n");
180
181 return result; 287 return result;
182 } 288 }
183 289
184 if (verbose && (options & STAT)) 290 if ( result == STATE_UNKNOWN )
185 printf ("%s ", statopts); 291 result = STATE_OK;
186 if (verbose && (options & PROG)) 292
187 printf ("%s ", prog); 293 /* Needed if procs found, but none match filter */
188 if (verbose && (options & PPID)) 294 if ( metric == METRIC_PROCS ) {
189 printf ("%d ", ppid); 295 result = max_state (result, check_thresholds (procs) );
190 if (verbose && (options & USER)) 296 }
191 printf ("%d ", uid);
192 297
298 if ( result == STATE_OK ) {
299 printf ("%s OK: %d process%s",
300 metric_name, procs, ( procs != 1 ? "es" : "") );
301 } else if (result == STATE_WARNING) {
302 if ( metric == METRIC_PROCS ) {
303 printf ("PROCS WARNING: %d process%s", procs,
304 ( procs != 1 ? "es" : ""));
305 } else {
306 printf ("%s WARNING: %d warn out of %d process%s",
307 metric_name, warn, procs,
308 ( procs != 1 ? "es" : ""));
309 }
310 } else if (result == STATE_CRITICAL) {
311 if (metric == METRIC_PROCS) {
312 printf ("PROCS CRITICAL: %d process%s", procs,
313 ( procs != 1 ? "es" : ""));
314 } else {
315 printf ("%s CRITICAL: %d crit, %d warn out of %d process%s",
316 metric_name, crit, warn, procs,
317 ( procs != 1 ? "es" : ""));
318 }
319 }
320
321 if (fmt != "") {
322 printf (" with %s", fmt);
323 }
324
325 if ( verbose >= 1 && fails != "" )
326 printf (" [%s]", fails);
327
328 printf ("\n");
329 return result;
330}
331
332/* Check thresholds against value */
333int
334check_thresholds (int value)
335{
193 if (wmax == -1 && cmax == -1 && wmin == -1 && cmin == -1) { 336 if (wmax == -1 && cmax == -1 && wmin == -1 && cmin == -1) {
194 if (result == STATE_UNKNOWN) 337 return OK;
195 result = STATE_OK;
196 printf (fmt, "OK", procs);
197 return result;
198 } 338 }
199 else if (cmax >= 0 && cmin >= 0 && cmax < cmin) { 339 else if (cmax >= 0 && cmin >= 0 && cmax < cmin) {
200 if (procs > cmax && procs < cmin) { 340 if (value > cmax && value < cmin)
201 printf (fmt, "CRITICAL", procs);
202 return STATE_CRITICAL; 341 return STATE_CRITICAL;
203 }
204 } 342 }
205 else if (cmax >= 0 && procs > cmax) { 343 else if (cmax >= 0 && value > cmax) {
206 printf (fmt, "CRITICAL", procs);
207 return STATE_CRITICAL; 344 return STATE_CRITICAL;
208 } 345 }
209 else if (cmin >= 0 && procs < cmin) { 346 else if (cmin >= 0 && value < cmin) {
210 printf (fmt, "CRITICAL", procs);
211 return STATE_CRITICAL; 347 return STATE_CRITICAL;
212 } 348 }
213 349
214 if (wmax >= 0 && wmin >= 0 && wmax < wmin) { 350 if (wmax >= 0 && wmin >= 0 && wmax < wmin) {
215 if (procs > wmax && procs < wmin) { 351 if (value > wmax && value < wmin) {
216 printf (fmt, "CRITICAL", procs); 352 return STATE_WARNING;
217 return STATE_CRITICAL;
218 } 353 }
219 } 354 }
220 else if (wmax >= 0 && procs > wmax) { 355 else if (wmax >= 0 && value > wmax) {
221 printf (fmt, "WARNING", procs); 356 return STATE_WARNING;
222 return max_state (result, STATE_WARNING);
223 } 357 }
224 else if (wmin >= 0 && procs < wmin) { 358 else if (wmin >= 0 && value < wmin) {
225 printf (fmt, "WARNING", procs); 359 return STATE_WARNING;
226 return max_state (result, STATE_WARNING);
227 }
228
229 printf (fmt, "OK", procs);
230 if ( result == STATE_UNKNOWN ) {
231 result = STATE_OK;
232 } 360 }
233 return result; 361 return STATE_OK;
234} 362}
235 363
236/* process command-line arguments */ 364/* process command-line arguments */
@@ -244,10 +372,14 @@ process_arguments (int argc, char **argv)
244 static struct option long_options[] = { 372 static struct option long_options[] = {
245 {"warning", required_argument, 0, 'w'}, 373 {"warning", required_argument, 0, 'w'},
246 {"critical", required_argument, 0, 'c'}, 374 {"critical", required_argument, 0, 'c'},
375 {"metric", required_argument, 0, 'm'},
247 {"timeout", required_argument, 0, 't'}, 376 {"timeout", required_argument, 0, 't'},
248 {"status", required_argument, 0, 's'}, 377 {"status", required_argument, 0, 's'},
249 {"ppid", required_argument, 0, 'p'}, 378 {"ppid", required_argument, 0, 'p'},
250 {"command", required_argument, 0, 'C'}, 379 {"command", required_argument, 0, 'C'},
380 {"vsz", required_argument, 0, 'z'},
381 {"rss", required_argument, 0, 'r'},
382 {"pcpu", required_argument, 0, 'P'},
251 {"argument-array", required_argument, 0, 'a'}, 383 {"argument-array", required_argument, 0, 'a'},
252 {"help", no_argument, 0, 'h'}, 384 {"help", no_argument, 0, 'h'},
253 {"version", no_argument, 0, 'V'}, 385 {"version", no_argument, 0, 'V'},
@@ -260,7 +392,8 @@ process_arguments (int argc, char **argv)
260 strcpy (argv[c], "-t"); 392 strcpy (argv[c], "-t");
261 393
262 while (1) { 394 while (1) {
263 c = getopt_long (argc, argv, "Vvht:c:w:p:s:u:C:a:", long_options, &option_index); 395 c = getopt_long (argc, argv, "Vvht:c:w:p:s:u:C:a:z:r:m:P:",
396 long_options, &option_index);
264 397
265 if (c == -1 || c == EOF) 398 if (c == -1 || c == EOF)
266 break; 399 break;
@@ -368,17 +501,70 @@ process_arguments (int argc, char **argv)
368 break; 501 break;
369 case 'C': /* command */ 502 case 'C': /* command */
370 asprintf (&prog, "%s", optarg); 503 asprintf (&prog, "%s", optarg);
371 asprintf (&fmt, "%s%scommand name %s", fmt, (options ? ", " : ""), 504 asprintf (&fmt, "%s%scommand name '%s'", fmt, (options ? ", " : ""),
372 prog); 505 prog);
373 options |= PROG; 506 options |= PROG;
374 break; 507 break;
375 case 'a': /* args (full path name with args) */ 508 case 'a': /* args (full path name with args) */
376 asprintf (&args, "%s", optarg); 509 asprintf (&args, "%s", optarg);
377 asprintf (&fmt, "%s%sargs %s", fmt, (options ? ", " : ""), args); 510 asprintf (&fmt, "%s%sargs '%s'", fmt, (options ? ", " : ""), args);
378 options |= ARGS; 511 options |= ARGS;
379 break; 512 break;
513 case 'r': /* RSS */
514 if (sscanf (optarg, "%d%[^0-9]", &rss, tmp) == 1) {
515 asprintf (&fmt, "%s%sRSS >= %d", fmt, (options ? ", " : ""), rss);
516 options |= RSS;
517 break;
518 }
519 printf ("%s: RSS must be an integer!\n\n",
520 progname);
521 print_usage ();
522 exit (STATE_UNKNOWN);
523 case 'z': /* VSZ */
524 if (sscanf (optarg, "%d%[^0-9]", &vsz, tmp) == 1) {
525 asprintf (&fmt, "%s%sVSZ >= %d", fmt, (options ? ", " : ""), vsz);
526 options |= VSZ;
527 break;
528 }
529 printf ("%s: VSZ must be an integer!\n\n",
530 progname);
531 print_usage ();
532 exit (STATE_UNKNOWN);
533 case 'P': /* PCPU */
534 /* TODO: -P 1.5.5 is accepted */
535 if (sscanf (optarg, "%f%[^0-9.]", &pcpu, tmp) == 1) {
536 asprintf (&fmt, "%s%sPCPU >= %.2f", fmt, (options ? ", " : ""), pcpu);
537 options |= PCPU;
538 break;
539 }
540 printf ("%s: PCPU must be a float!\n\n",
541 progname);
542 print_usage ();
543 exit (STATE_UNKNOWN);
544 case 'm':
545 asprintf (&metric_name, "%s", optarg);
546 if ( strcmp(optarg, "PROCS") == 0) {
547 metric = METRIC_PROCS;
548 break;
549 }
550 else if ( strcmp(optarg, "VSZ") == 0) {
551 metric = METRIC_VSZ;
552 break;
553 }
554 else if ( strcmp(optarg, "RSS") == 0 ) {
555 metric = METRIC_RSS;
556 break;
557 }
558 else if ( strcmp(optarg, "CPU") == 0 ) {
559 metric = METRIC_CPU;
560 break;
561 }
562 printf ("%s: metric must be one of PROCS, VSZ, RSS, CPU!\n\n",
563 progname);
564 print_usage ();
565 exit (STATE_UNKNOWN);
380 case 'v': /* command */ 566 case 'v': /* command */
381 verbose = TRUE; 567 verbose++;
382 break; 568 break;
383 } 569 }
384 } 570 }
@@ -402,7 +588,7 @@ int
402validate_arguments () 588validate_arguments ()
403{ 589{
404 590
405if (wmax >= 0 && wmin == -1) 591 if (wmax >= 0 && wmin == -1)
406 wmin = 0; 592 wmin = 0;
407 if (cmax >= 0 && cmin == -1) 593 if (cmax >= 0 && cmin == -1)
408 cmin = 0; 594 cmin = 0;
@@ -422,13 +608,8 @@ if (wmax >= 0 && wmin == -1)
422/* return ERROR; */ 608/* return ERROR; */
423/* } */ 609/* } */
424 610
425 if (options == 0) { 611 if (options == 0)
426 options = 1; 612 options = ALL;
427 asprintf (&fmt, "%%s - %%d processes running\n");
428 }
429 else {
430 asprintf (&fmt, "%%s - %%d processes running with %s\n", fmt);
431 }
432 613
433 return options; 614 return options;
434} 615}
@@ -442,37 +623,14 @@ print_help (void)
442 ("Copyright (c) %s %s <%s>\n\n%s\n", 623 ("Copyright (c) %s %s <%s>\n\n%s\n",
443 COPYRIGHT, AUTHOR, EMAIL, SUMMARY); 624 COPYRIGHT, AUTHOR, EMAIL, SUMMARY);
444 print_usage (); 625 print_usage ();
445 printf 626 printf ("\nOptions:\n" LONGOPTIONS "\nExamples:\n" EXAMPLES "\n");
446 ("\nRequired Arguments:\n" 627}
447 " -w, --warning=RANGE\n"
448 " generate warning state if process count is outside this range\n"
449 " -c, --critical=RANGE\n"
450 " generate critical state if process count is outside this range\n\n"
451 "Optional Filters:\n"
452 " -s, --state=STATUSFLAGS\n"
453 " Only scan for processes that have, in the output of `ps`, one or\n"
454 " more of the status flags you specify (for example R, Z, S, RS,\n"
455 " RSZDT, plus others based on the output of your 'ps' command).\n"
456 " -p, --ppid=PPID\n"
457 " Only scan for children of the parent process ID indicated.\n"
458 " -u, --user=USER\n"
459 " Only scan for proceses with user name or ID indicated.\n"
460 " -a, --argument-array=STRING\n"
461 " Only scan for ARGS that match up to the length of the given STRING\n"
462 " -C, --command=COMMAND\n"
463 " Only scan for exact matches to the named COMMAND.\n\n"
464 "RANGEs are specified 'min:max' or 'min:' or ':max' (or 'max'). If\n"
465 "specified 'max:min', a warning status will be generated if the\n"
466
467 "count is inside the specified range\n");}
468
469 628
470void 629void
471print_usage (void) 630print_usage (void)
472{ 631{
473 printf 632 printf ("Usage:\n" " %s %s\n"
474 ("Usage:\n" 633 " %s (-h | --help) for detailed help\n"
475 " check_procs -w <range> -c <range> [-s state] [-p ppid] [-u user]\n" 634 " %s (-V | --version) for version information\n",
476 " [-a argument-array] [-C command]\n" 635 progname, OPTIONS, progname, progname);
477 " check_procs --version\n" " check_procs --help\n");
478} 636}
diff --git a/plugins/check_vsz.c b/plugins/check_vsz.c
deleted file mode 100644
index 7a9acb2..0000000
--- a/plugins/check_vsz.c
+++ /dev/null
@@ -1,250 +0,0 @@
1/******************************************************************************
2 *
3 * CHECK_VSZ.C
4 *
5 * Program: Process plugin for Nagios
6 * License: GPL
7 * Copyright (c) 1999,2000 Karl DeBisschop <kdebiss@alum.mit.edu>
8 *
9 * Last Modified: $Date$
10 *
11 * Description:
12 *
13 * This plugin will check for processes whose total image size exceeds
14 * the warning or critical thresholds given on the command line. With
15 * no command_name, everything that shows up on ps is evaluated.
16 * Otherwise, only jobs with the command_name given are examined.
17 * This program is particularly useful if you have to run a piece of
18 * commercial software that has a memory leak. With it you can shut
19 * down and restart the processes whenever the program threatens to
20 * take over your system.
21 *
22 * Modifications:
23 *
24 * 11-18-1999 Karl DeBisschop (kdebiss@alum.mit.edu)
25 * change to getopt, use print_help
26 * 08-18-1999 Ethan Galstad (nagios@nagios.org)
27 * Changed code to use common include file
28 * Changed fclose() to pclose()
29 * 09-09-1999 Ethan Galstad (nagios@nagios.org)
30 * Changed popen()/pclose() to spopen()/spclose()
31 * 11-18-1999 Karl DeBisschop (kdebiss@alum.mit.edu)
32 * set STATE_WARNING of stderr written or nonzero status returned
33 *
34 *****************************************************************************/
35
36const char *progname = "check_vsz";
37#define REVISION "$Revision$"
38#define COPYRIGHT "1999-2002"
39#define AUTHOR "Karl DeBisschop"
40#define EMAIL "karl@debisschop.net"
41#define SUMMARY "Check the image size of a running program.\n"
42
43#include "common.h"
44#include "popen.h"
45#include "utils.h"
46
47int process_arguments (int argc, char **argv);
48void print_help (const char *cmd);
49void print_usage (const char *cmd);
50
51int warn = -1;
52int crit = -1;
53char *proc = NULL;
54
55int
56main (int argc, char **argv)
57{
58 int len;
59 int result = STATE_OK;
60 int line = 0;
61 int proc_size = -1;
62 char input_buffer[MAX_INPUT_BUFFER];
63 char proc_name[MAX_INPUT_BUFFER];
64 char *message = "";
65
66 if (process_arguments (argc, argv) == ERROR) {
67 printf ("%s: failure parsing arguments\n", progname);
68 print_help (progname);
69 return STATE_UNKNOWN;
70 }
71
72 /* run the command */
73 child_process = spopen (VSZ_COMMAND);
74 if (child_process == NULL) {
75 printf ("Unable to open pipe: %s\n", VSZ_COMMAND);
76 return STATE_UNKNOWN;
77 }
78
79 child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r");
80 if (child_stderr == NULL)
81 printf ("Could not open stderr for %s\n", VSZ_COMMAND);
82
83 while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) {
84
85 line++;
86
87 /* skip the first line */
88 if (line == 1)
89 continue;
90
91 if (sscanf (input_buffer, VSZ_FORMAT, &proc_size, proc_name) == 2) {
92 if (proc == NULL) {
93 if (proc_size > warn) {
94 asprintf (&message, "%s %s(%d)", message, proc_name, proc_size);
95 result = max_state (result, STATE_WARNING);
96 }
97 if (proc_size > crit) {
98 result = STATE_CRITICAL;
99 }
100 }
101 else if (strstr (proc_name, proc)) {
102 asprintf (&message, "%s %d", message, proc_size);
103 if (proc_size > warn) {
104 result = max_state (result, STATE_WARNING);
105 }
106 if (proc_size > crit) {
107 result = STATE_CRITICAL;
108 }
109 }
110 }
111 }
112
113 /* If we get anything on STDERR, at least set warning */
114 while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr))
115 result = max_state (result, STATE_WARNING);
116
117 (void) fclose (child_stderr);
118
119 /* close the pipe */
120 if (spclose (child_process))
121 result = max_state (result, STATE_WARNING);
122
123 if (result == STATE_OK)
124 printf ("ok (all VSZ<%d): %s\n", warn, message);
125 else if (result == STATE_UNKNOWN)
126 printf ("Unable to read output\n");
127 else if (result == STATE_WARNING)
128 printf ("WARNING (VSZ>%d):%s\n", warn, message);
129 else
130 printf ("CRITICAL (VSZ>%d):%s\n", crit, message);
131
132 return result;
133}
134
135
136
137
138int
139process_arguments (int argc, char **argv)
140{
141 int c;
142
143 int option_index = 0;
144 static struct option long_options[] = {
145 {"help", no_argument, 0, 'h'},
146 {"version", no_argument, 0, 'V'},
147 {"critical", required_argument, 0, 'c'},
148 {"warning", required_argument, 0, 'w'},
149 {"command", required_argument, 0, 'C'},
150 {0, 0, 0, 0}
151 };
152
153 if (argc < 2)
154 return ERROR;
155
156 while (1) {
157 c = getopt_long (argc, argv, "+hVc:w:C:", long_options, &option_index);
158
159 if (c == EOF)
160 break;
161
162 switch (c) {
163 case '?': /* help */
164 print_usage (progname);
165 exit (STATE_UNKNOWN);
166 case 'h': /* help */
167 print_help (progname);
168 exit (STATE_OK);
169 case 'V': /* version */
170 print_revision (progname, "$Revision$");
171 exit (STATE_OK);
172 case 'c': /* critical threshold */
173 if (!is_intnonneg (optarg)) {
174 printf ("%s: critical threshold must be an integer: %s\n",
175 progname, optarg);
176 print_usage (progname);
177 exit (STATE_UNKNOWN);
178 }
179 crit = atoi (optarg);
180 break;
181 case 'w': /* warning threshold */
182 if (!is_intnonneg (optarg)) {
183 printf ("%s: warning threshold must be an integer: %s\n",
184 progname, optarg);
185 print_usage (progname);
186 exit (STATE_UNKNOWN);
187 }
188 warn = atoi (optarg);
189 break;
190 case 'C': /* command name */
191 proc = optarg;
192 break;
193 }
194 }
195
196 c = optind;
197 if (warn == -1) {
198 if (!is_intnonneg (argv[c])) {
199 printf ("%s: critical threshold must be an integer: %s\n",
200 progname, argv[c]);
201 print_usage (progname);
202 exit (STATE_UNKNOWN);
203 }
204 warn = atoi (argv[c++]);
205 }
206
207 if (crit == -1) {
208 if (!is_intnonneg (argv[c])) {
209 printf ("%s: critical threshold must be an integer: %s\n",
210 progname, argv[c]);
211 print_usage (progname);
212 exit (STATE_UNKNOWN);
213 }
214 crit = atoi (argv[c++]);
215 }
216
217 if (proc == NULL)
218 proc = argv[c];
219
220 return c;
221}
222
223void
224print_usage (const char *cmd)
225{
226 printf ("Usage: %s -w <wsize> -c <csize> [-C command]\n"
227 " %s --help\n" " %s --version\n", cmd, cmd, cmd);
228}
229
230void
231print_help (const char *cmd)
232{
233 print_revision ("check_vsz", "$Revision$");
234 printf
235 ("Copyright (c) 2000 Karl DeBisschop <kdebiss@alum.mit.edu>\n\n"
236 "This plugin checks the image size of a running program and returns an\n"
237 "error if the number is above either of the thresholds given.\n\n");
238 print_usage (cmd);
239 printf
240 ("\nOptions:\n"
241 " -h, --help\n"
242 " Print detailed help\n"
243 " -V, --version\n"
244 " Print version numbers and license information\n"
245 " -w, --warning=INTEGER\n"
246 " Program image size necessary to cause a WARNING state\n"
247 " -c, --critical=INTEGER\n"
248 " Program image size necessary to cause a CRITICAL state\n"
249 " -C, --command=STRING\n" " Program to search for [optional]\n");
250}