summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/check_procs.c366
1 files changed, 191 insertions, 175 deletions
diff --git a/plugins/check_procs.c b/plugins/check_procs.c
index ccf0891..1b641c5 100644
--- a/plugins/check_procs.c
+++ b/plugins/check_procs.c
@@ -1,114 +1,36 @@
1/****************************************************************************** 1/******************************************************************************
2*
3* CHECK_PROCS.C
4*
5* Program: Process plugin for Nagios
6* License: GPL
7* Copyright (c) 1999 Ethan Galstad (nagios@nagios.org)
8*
9* $Id$
10*
11* Description:
12*
13* This plugin checks the number of currently running processes and
14* generates WARNING or CRITICAL states if the process count is outside
15* the specified threshold ranges. The process count can be filtered by
16* process owner, parent process PID, current state (e.g., 'Z'), or may
17* be the total number of running processes
18*
19* License Information:
20*
21* This program is free software; you can redistribute it and/or modify
22* it under the terms of the GNU General Public License as published by
23* the Free Software Foundation; either version 2 of the License, or
24* (at your option) any later version.
25*
26* This program is distributed in the hope that it will be useful, but
27* WITHOUT ANY WARRANTY; without even the implied warranty of
28* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
29* General Public License for more details.
30*
31* You should have received a copy of the GNU General Public License
32* along with this program; if not, write to the Free Software
33* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
34*
35******************************************************************************/
36 2
37const char *progname = "check_procs"; 3 This program is free software; you can redistribute it and/or modify
38#define REVISION "$Revision$" 4 it under the terms of the GNU General Public License as published by
39#define COPYRIGHT "1999-2002" 5 the Free Software Foundation; either version 2 of the License, or
40#define AUTHOR "Ethan Galstad" 6 (at your option) any later version.
41#define EMAIL "nagios@nagios.org"
42#define SUMMARY "\
43Checks all processes and generates WARNING or CRITICAL states if the specified\n\
44metric is outside the required threshold ranges. The metric defaults to number\n\
45of processes. Search filters can be applied to limit the processes to check.\n"
46 7
47#define OPTIONS "\ 8 This program is distributed in the hope that it will be useful,
48-w <range> -c <range> [-m metric]\n\ 9 but WITHOUT ANY WARRANTY; without even the implied warranty of
49 [-s state] [-p ppid] [-u user] [-r rss] [-z vsz] [-P %cpu]\n\ 10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
50 [-a argument-array] [-C command] [-v]" 11 GNU General Public License for more details.
51 12
52#define LONGOPTIONS "\ 13 You should have received a copy of the GNU General Public License
53Required Arguments:\n\ 14 along with this program; if not, write to the Free Software
54 -w, --warning=RANGE\n\ 15 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
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 processes with args that contain 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 16
91#define EXAMPLES "\ 17******************************************************************************/
92 check_procs -w 2:2 -c 2:1024 -C portsentry\n\ 18
93 Warning if not two processes with command name portsentry. Critical\n\ 19const char *progname = "check_procs";
94 if < 2 or > 1024 processes\n\ 20const char *revision = "$Revision$";
95 check_procs -w 10 -a '/usr/local/bin/perl' -u root\n\ 21const char *copyright = "2000-2003";
96 Warning alert if > 10 processes with command arguments containing \n\ 22const char *email = "nagiosplug-devel@lists.sourceforge.net";
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"
100 23
101#include "config.h"
102#include <pwd.h>
103#include "common.h" 24#include "common.h"
104#include "popen.h" 25#include "popen.h"
105#include "utils.h" 26#include "utils.h"
27#include <pwd.h>
106 28
107int process_arguments (int, char **); 29int process_arguments (int, char **);
108int validate_arguments (void); 30int validate_arguments (void);
109void print_usage (void);
110void print_help (void);
111int check_thresholds (int); 31int check_thresholds (int);
32void print_help (void);
33void print_usage (void);
112 34
113int wmax = -1; 35int wmax = -1;
114int cmax = -1; 36int cmax = -1;
@@ -147,6 +69,11 @@ char *fmt = "";
147char *fails = ""; 69char *fails = "";
148char tmp[MAX_INPUT_BUFFER]; 70char tmp[MAX_INPUT_BUFFER];
149 71
72
73
74
75
76
150int 77int
151main (int argc, char **argv) 78main (int argc, char **argv)
152{ 79{
@@ -170,7 +97,7 @@ main (int argc, char **argv)
170 int cols; /* number of columns in ps output */ 97 int cols; /* number of columns in ps output */
171 int warn = 0; /* number of processes in warn state */ 98 int warn = 0; /* number of processes in warn state */
172 int crit = 0; /* number of processes in crit state */ 99 int crit = 0; /* number of processes in crit state */
173 int i; 100 int i = 0;
174 101
175 int result = STATE_UNKNOWN; 102 int result = STATE_UNKNOWN;
176 103
@@ -178,26 +105,26 @@ main (int argc, char **argv)
178 metric = METRIC_PROCS; 105 metric = METRIC_PROCS;
179 106
180 if (process_arguments (argc, argv) == ERROR) 107 if (process_arguments (argc, argv) == ERROR)
181 usage ("Unable to parse command line\n"); 108 usage (_("Unable to parse command line\n"));
182 109
183 if (verbose >= 2) 110 if (verbose >= 2)
184 printf ("CMD: %s\n", PS_COMMAND); 111 printf (_("CMD: %s\n"), PS_COMMAND);
185 112
186 child_process = spopen (PS_COMMAND); 113 child_process = spopen (PS_COMMAND);
187 if (child_process == NULL) { 114 if (child_process == NULL) {
188 printf ("Could not open pipe: %s\n", PS_COMMAND); 115 printf (_("Could not open pipe: %s\n"), PS_COMMAND);
189 return STATE_UNKNOWN; 116 return STATE_UNKNOWN;
190 } 117 }
191 118
192 child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r"); 119 child_stderr = fdopen (child_stderr_array[fileno (child_process)], "r");
193 if (child_stderr == NULL) 120 if (child_stderr == NULL)
194 printf ("Could not open stderr for %s\n", PS_COMMAND); 121 printf (_("Could not open stderr for %s\n"), PS_COMMAND);
195 122
196 fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process); 123 fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process);
197 124
198 while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) { 125 while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) {
199 strcpy(procprog,""); 126 strcpy (procprog, "");
200 asprintf(&procargs,""); 127 asprintf (&procargs, "%s", "");
201 128
202 cols = sscanf (input_buffer, PS_FORMAT, PS_VARLIST); 129 cols = sscanf (input_buffer, PS_FORMAT, PS_VARLIST);
203 130
@@ -270,28 +197,28 @@ main (int argc, char **argv)
270 } 197 }
271 /* This should not happen */ 198 /* This should not happen */
272 else if (verbose) { 199 else if (verbose) {
273 printf("Not parseable: %s", input_buffer); 200 printf(_("Not parseable: %s"), input_buffer);
274 } 201 }
275 } 202 }
276 203
277 /* If we get anything on STDERR, at least set warning */ 204 /* If we get anything on STDERR, at least set warning */
278 while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) { 205 while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) {
279 if (verbose) 206 if (verbose)
280 printf ("STDERR: %s", input_buffer); 207 printf (_("STDERR: %s"), input_buffer);
281 result = max_state (result, STATE_WARNING); 208 result = max_state (result, STATE_WARNING);
282 printf ("System call sent warnings to stderr\n"); 209 printf (_("System call sent warnings to stderr\n"));
283 } 210 }
284 211
285 (void) fclose (child_stderr); 212 (void) fclose (child_stderr);
286 213
287 /* close the pipe */ 214 /* close the pipe */
288 if (spclose (child_process)) { 215 if (spclose (child_process)) {
289 printf ("System call returned nonzero status\n"); 216 printf (_("System call returned nonzero status\n"));
290 result = max_state (result, STATE_WARNING); 217 result = max_state (result, STATE_WARNING);
291 } 218 }
292 219
293 if (found == 0) { /* no process lines parsed so return STATE_UNKNOWN */ 220 if (found == 0) { /* no process lines parsed so return STATE_UNKNOWN */
294 printf ("Unable to read output\n"); 221 printf (_("Unable to read output\n"));
295 return result; 222 return result;
296 } 223 }
297 224
@@ -304,23 +231,23 @@ main (int argc, char **argv)
304 } 231 }
305 232
306 if ( result == STATE_OK ) { 233 if ( result == STATE_OK ) {
307 printf ("%s OK: %d process%s", 234 printf (_("%s OK: %d process%s"),
308 metric_name, procs, ( procs != 1 ? "es" : "") ); 235 metric_name, procs, ( procs != 1 ? "es" : "") );
309 } else if (result == STATE_WARNING) { 236 } else if (result == STATE_WARNING) {
310 if ( metric == METRIC_PROCS ) { 237 if ( metric == METRIC_PROCS ) {
311 printf ("PROCS WARNING: %d process%s", procs, 238 printf (_("PROCS WARNING: %d process%s"), procs,
312 ( procs != 1 ? "es" : "")); 239 ( procs != 1 ? "es" : ""));
313 } else { 240 } else {
314 printf ("%s WARNING: %d warn out of %d process%s", 241 printf (_("%s WARNING: %d warn out of %d process%s"),
315 metric_name, warn, procs, 242 metric_name, warn, procs,
316 ( procs != 1 ? "es" : "")); 243 ( procs != 1 ? "es" : ""));
317 } 244 }
318 } else if (result == STATE_CRITICAL) { 245 } else if (result == STATE_CRITICAL) {
319 if (metric == METRIC_PROCS) { 246 if (metric == METRIC_PROCS) {
320 printf ("PROCS CRITICAL: %d process%s", procs, 247 printf (_("PROCS CRITICAL: %d process%s"), procs,
321 ( procs != 1 ? "es" : "")); 248 ( procs != 1 ? "es" : ""));
322 } else { 249 } else {
323 printf ("%s CRITICAL: %d crit, %d warn out of %d process%s", 250 printf (_("%s CRITICAL: %d crit, %d warn out of %d process%s"),
324 metric_name, crit, warn, procs, 251 metric_name, crit, warn, procs,
325 ( procs != 1 ? "es" : "")); 252 ( procs != 1 ? "es" : ""));
326 } 253 }
@@ -337,38 +264,11 @@ main (int argc, char **argv)
337 return result; 264 return result;
338} 265}
339 266
340/* Check thresholds against value */
341int
342check_thresholds (int value)
343{
344 if (wmax == -1 && cmax == -1 && wmin == -1 && cmin == -1) {
345 return OK;
346 }
347 else if (cmax >= 0 && cmin >= 0 && cmax < cmin) {
348 if (value > cmax && value < cmin)
349 return STATE_CRITICAL;
350 }
351 else if (cmax >= 0 && value > cmax) {
352 return STATE_CRITICAL;
353 }
354 else if (cmin >= 0 && value < cmin) {
355 return STATE_CRITICAL;
356 }
357 267
358 if (wmax >= 0 && wmin >= 0 && wmax < wmin) {
359 if (value > wmax && value < wmin) {
360 return STATE_WARNING;
361 }
362 }
363 else if (wmax >= 0 && value > wmax) {
364 return STATE_WARNING;
365 }
366 else if (wmin >= 0 && value < wmin) {
367 return STATE_WARNING;
368 }
369 return STATE_OK;
370}
371 268
269
270
271
372/* process command-line arguments */ 272/* process command-line arguments */
373int 273int
374process_arguments (int argc, char **argv) 274process_arguments (int argc, char **argv)
@@ -414,11 +314,11 @@ process_arguments (int argc, char **argv)
414 print_help (); 314 print_help ();
415 exit (STATE_OK); 315 exit (STATE_OK);
416 case 'V': /* version */ 316 case 'V': /* version */
417 print_revision (progname, REVISION); 317 print_revision (progname, revision);
418 exit (STATE_OK); 318 exit (STATE_OK);
419 case 't': /* timeout period */ 319 case 't': /* timeout period */
420 if (!is_integer (optarg)) { 320 if (!is_integer (optarg)) {
421 printf ("%s: Timeout Interval must be an integer!\n\n", 321 printf (_("%s: Timeout Interval must be an integer!\n\n"),
422 progname); 322 progname);
423 print_usage (); 323 print_usage ();
424 exit (STATE_UNKNOWN); 324 exit (STATE_UNKNOWN);
@@ -440,7 +340,7 @@ process_arguments (int argc, char **argv)
440 break; 340 break;
441 } 341 }
442 else { 342 else {
443 printf ("%s: Critical Process Count must be an integer!\n\n", 343 printf (_("%s: Critical Process Count must be an integer!\n\n"),
444 progname); 344 progname);
445 print_usage (); 345 print_usage ();
446 exit (STATE_UNKNOWN); 346 exit (STATE_UNKNOWN);
@@ -460,7 +360,7 @@ process_arguments (int argc, char **argv)
460 break; 360 break;
461 } 361 }
462 else { 362 else {
463 printf ("%s: Warning Process Count must be an integer!\n\n", 363 printf (_("%s: Warning Process Count must be an integer!\n\n"),
464 progname); 364 progname);
465 print_usage (); 365 print_usage ();
466 exit (STATE_UNKNOWN); 366 exit (STATE_UNKNOWN);
@@ -471,13 +371,13 @@ process_arguments (int argc, char **argv)
471 options |= PPID; 371 options |= PPID;
472 break; 372 break;
473 } 373 }
474 printf ("%s: Parent Process ID must be an integer!\n\n", 374 printf (_("%s: Parent Process ID must be an integer!\n\n"),
475 progname); 375 progname);
476 print_usage (); 376 print_usage ();
477 exit (STATE_UNKNOWN); 377 exit (STATE_UNKNOWN);
478 case 's': /* status */ 378 case 's': /* status */
479 asprintf (&statopts, "%s", optarg); 379 asprintf (&statopts, "%s", optarg);
480 asprintf (&fmt, "%s%sSTATE = %s", fmt, (options ? ", " : ""), statopts); 380 asprintf (&fmt, _("%s%sSTATE = %s"), fmt, (options ? ", " : ""), statopts);
481 options |= STAT; 381 options |= STAT;
482 break; 382 break;
483 case 'u': /* user or user id */ 383 case 'u': /* user or user id */
@@ -486,7 +386,7 @@ process_arguments (int argc, char **argv)
486 pw = getpwuid ((uid_t) uid); 386 pw = getpwuid ((uid_t) uid);
487 /* check to be sure user exists */ 387 /* check to be sure user exists */
488 if (pw == NULL) { 388 if (pw == NULL) {
489 printf ("UID %d was not found\n", uid); 389 printf (_("UID %d was not found\n"), uid);
490 print_usage (); 390 print_usage ();
491 exit (STATE_UNKNOWN); 391 exit (STATE_UNKNOWN);
492 } 392 }
@@ -495,7 +395,7 @@ process_arguments (int argc, char **argv)
495 pw = getpwnam (optarg); 395 pw = getpwnam (optarg);
496 /* check to be sure user exists */ 396 /* check to be sure user exists */
497 if (pw == NULL) { 397 if (pw == NULL) {
498 printf ("User name %s was not found\n", optarg); 398 printf (_("User name %s was not found\n"), optarg);
499 print_usage (); 399 print_usage ();
500 exit (STATE_UNKNOWN); 400 exit (STATE_UNKNOWN);
501 } 401 }
@@ -503,49 +403,49 @@ process_arguments (int argc, char **argv)
503 uid = pw->pw_uid; 403 uid = pw->pw_uid;
504 } 404 }
505 user = pw->pw_name; 405 user = pw->pw_name;
506 asprintf (&fmt, "%s%sUID = %d (%s)", fmt, (options ? ", " : ""), 406 asprintf (&fmt, _("%s%sUID = %d (%s)"), fmt, (options ? ", " : ""),
507 uid, user); 407 uid, user);
508 options |= USER; 408 options |= USER;
509 break; 409 break;
510 case 'C': /* command */ 410 case 'C': /* command */
511 asprintf (&prog, "%s", optarg); 411 asprintf (&prog, "%s", optarg);
512 asprintf (&fmt, "%s%scommand name '%s'", fmt, (options ? ", " : ""), 412 asprintf (&fmt, _("%s%scommand name '%s'"), fmt, (options ? ", " : ""),
513 prog); 413 prog);
514 options |= PROG; 414 options |= PROG;
515 break; 415 break;
516 case 'a': /* args (full path name with args) */ 416 case 'a': /* args (full path name with args) */
517 asprintf (&args, "%s", optarg); 417 asprintf (&args, "%s", optarg);
518 asprintf (&fmt, "%s%sargs '%s'", fmt, (options ? ", " : ""), args); 418 asprintf (&fmt, _("%s%sargs '%s'"), fmt, (options ? ", " : ""), args);
519 options |= ARGS; 419 options |= ARGS;
520 break; 420 break;
521 case 'r': /* RSS */ 421 case 'r': /* RSS */
522 if (sscanf (optarg, "%d%[^0-9]", &rss, tmp) == 1) { 422 if (sscanf (optarg, "%d%[^0-9]", &rss, tmp) == 1) {
523 asprintf (&fmt, "%s%sRSS >= %d", fmt, (options ? ", " : ""), rss); 423 asprintf (&fmt, _("%s%sRSS >= %d"), fmt, (options ? ", " : ""), rss);
524 options |= RSS; 424 options |= RSS;
525 break; 425 break;
526 } 426 }
527 printf ("%s: RSS must be an integer!\n\n", 427 printf (_("%s: RSS must be an integer!\n\n"),
528 progname); 428 progname);
529 print_usage (); 429 print_usage ();
530 exit (STATE_UNKNOWN); 430 exit (STATE_UNKNOWN);
531 case 'z': /* VSZ */ 431 case 'z': /* VSZ */
532 if (sscanf (optarg, "%d%[^0-9]", &vsz, tmp) == 1) { 432 if (sscanf (optarg, "%d%[^0-9]", &vsz, tmp) == 1) {
533 asprintf (&fmt, "%s%sVSZ >= %d", fmt, (options ? ", " : ""), vsz); 433 asprintf (&fmt, _("%s%sVSZ >= %d"), fmt, (options ? ", " : ""), vsz);
534 options |= VSZ; 434 options |= VSZ;
535 break; 435 break;
536 } 436 }
537 printf ("%s: VSZ must be an integer!\n\n", 437 printf (_("%s: VSZ must be an integer!\n\n"),
538 progname); 438 progname);
539 print_usage (); 439 print_usage ();
540 exit (STATE_UNKNOWN); 440 exit (STATE_UNKNOWN);
541 case 'P': /* PCPU */ 441 case 'P': /* PCPU */
542 /* TODO: -P 1.5.5 is accepted */ 442 /* TODO: -P 1.5.5 is accepted */
543 if (sscanf (optarg, "%f%[^0-9.]", &pcpu, tmp) == 1) { 443 if (sscanf (optarg, "%f%[^0-9.]", &pcpu, tmp) == 1) {
544 asprintf (&fmt, "%s%sPCPU >= %.2f", fmt, (options ? ", " : ""), pcpu); 444 asprintf (&fmt, _("%s%sPCPU >= %.2f"), fmt, (options ? ", " : ""), pcpu);
545 options |= PCPU; 445 options |= PCPU;
546 break; 446 break;
547 } 447 }
548 printf ("%s: PCPU must be a float!\n\n", 448 printf (_("%s: PCPU must be a float!\n\n"),
549 progname); 449 progname);
550 print_usage (); 450 print_usage ();
551 exit (STATE_UNKNOWN); 451 exit (STATE_UNKNOWN);
@@ -567,7 +467,7 @@ process_arguments (int argc, char **argv)
567 metric = METRIC_CPU; 467 metric = METRIC_CPU;
568 break; 468 break;
569 } 469 }
570 printf ("%s: metric must be one of PROCS, VSZ, RSS, CPU!\n\n", 470 printf (_("%s: metric must be one of PROCS, VSZ, RSS, CPU!\n\n"),
571 progname); 471 progname);
572 print_usage (); 472 print_usage ();
573 exit (STATE_UNKNOWN); 473 exit (STATE_UNKNOWN);
@@ -584,7 +484,7 @@ process_arguments (int argc, char **argv)
584 cmax = atoi (argv[c++]); 484 cmax = atoi (argv[c++]);
585 if (statopts == NULL && argv[c]) { 485 if (statopts == NULL && argv[c]) {
586 asprintf (&statopts, "%s", argv[c++]); 486 asprintf (&statopts, "%s", argv[c++]);
587 asprintf (&fmt, "%s%sSTATE = %s", fmt, (options ? ", " : ""), statopts); 487 asprintf (&fmt, _("%s%sSTATE = %s"), fmt, (options ? ", " : ""), statopts);
588 options |= STAT; 488 options |= STAT;
589 } 489 }
590 490
@@ -592,6 +492,8 @@ process_arguments (int argc, char **argv)
592} 492}
593 493
594 494
495
496
595int 497int
596validate_arguments () 498validate_arguments ()
597{ 499{
@@ -602,11 +504,11 @@ validate_arguments ()
602 cmin = 0; 504 cmin = 0;
603 if (wmax >= wmin && cmax >= cmin) { /* standard ranges */ 505 if (wmax >= wmin && cmax >= cmin) { /* standard ranges */
604 if (wmax > cmax && cmax != -1) { 506 if (wmax > cmax && cmax != -1) {
605 printf ("wmax (%d) cannot be greater than cmax (%d)\n", wmax, cmax); 507 printf (_("wmax (%d) cannot be greater than cmax (%d)\n"), wmax, cmax);
606 return ERROR; 508 return ERROR;
607 } 509 }
608 if (cmin > wmin && wmin != -1) { 510 if (cmin > wmin && wmin != -1) {
609 printf ("wmin (%d) cannot be less than cmin (%d)\n", wmin, cmin); 511 printf (_("wmin (%d) cannot be less than cmin (%d)\n"), wmin, cmin);
610 return ERROR; 512 return ERROR;
611 } 513 }
612 } 514 }
@@ -623,22 +525,136 @@ validate_arguments ()
623} 525}
624 526
625 527
528
529
530
531
532/* Check thresholds against value */
533int
534check_thresholds (int value)
535{
536 if (wmax == -1 && cmax == -1 && wmin == -1 && cmin == -1) {
537 return OK;
538 }
539 else if (cmax >= 0 && cmin >= 0 && cmax < cmin) {
540 if (value > cmax && value < cmin)
541 return STATE_CRITICAL;
542 }
543 else if (cmax >= 0 && value > cmax) {
544 return STATE_CRITICAL;
545 }
546 else if (cmin >= 0 && value < cmin) {
547 return STATE_CRITICAL;
548 }
549
550 if (wmax >= 0 && wmin >= 0 && wmax < wmin) {
551 if (value > wmax && value < wmin) {
552 return STATE_WARNING;
553 }
554 }
555 else if (wmax >= 0 && value > wmax) {
556 return STATE_WARNING;
557 }
558 else if (wmin >= 0 && value < wmin) {
559 return STATE_WARNING;
560 }
561 return STATE_OK;
562}
563
564
565
566
567
568
626void 569void
627print_help (void) 570print_help (void)
628{ 571{
629 print_revision (progname, REVISION); 572 print_revision (progname, revision);
630 printf 573
631 ("Copyright (c) %s %s <%s>\n\n%s\n", 574 printf (_("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>"));
632 COPYRIGHT, AUTHOR, EMAIL, SUMMARY); 575 printf (_(COPYRIGHT), copyright, email);
576
577 printf(_("\
578Checks all processes and generates WARNING or CRITICAL states if the specified\n\
579metric is outside the required threshold ranges. The metric defaults to number\n\
580of processes. Search filters can be applied to limit the processes to check.\n\n"));
581
633 print_usage (); 582 print_usage ();
634 printf ("\nOptions:\n" LONGOPTIONS "\nExamples:\n" EXAMPLES "\n"); 583
584 printf(_("\n\
585Required Arguments:\n\
586 -w, --warning=RANGE\n\
587 Generate warning state if metric is outside this range\n\
588 -c, --critical=RANGE\n\
589 Generate critical state if metric is outside this range\n"));
590
591 printf(_("\n\
592Optional Arguments:\n\
593 -m, --metric=TYPE\n\
594 Check thresholds against metric. Valid types:\n\
595 PROCS - number of processes (default)\n\
596 VSZ - virtual memory size\n\
597 RSS - resident set memory size\n\
598 CPU - percentage cpu\n\
599 -v, --verbose\n\
600 Extra information. Up to 3 verbosity levels\n"));
601
602 printf(_("\n\
603Optional Filters:\n\
604 -s, --state=STATUSFLAGS\n\
605 Only scan for processes that have, in the output of `ps`, one or\n\
606 more of the status flags you specify (for example R, Z, S, RS,\n\
607 RSZDT, plus others based on the output of your 'ps' command).\n\
608 -p, --ppid=PPID\n\
609 Only scan for children of the parent process ID indicated.\n\
610 -z, --vsz=VSZ\n\
611 Only scan for processes with vsz higher than indicated.\n\
612 -r, --rss=RSS\n\
613 Only scan for processes with rss higher than indicated.\n"));
614
615 printf(_("\
616 -P, --pcpu=PCPU\n\
617 Only scan for processes with pcpu higher than indicated.\n\
618 -u, --user=USER\n\
619 Only scan for processes with user name or ID indicated.\n\
620 -a, --argument-array=STRING\n\
621 Only scan for processes with args that contain STRING.\n\
622 -C, --command=COMMAND\n\
623 Only scan for exact matches to the named COMMAND.\n"));
624
625 printf(_("\n\
626RANGEs are specified 'min:max' or 'min:' or ':max' (or 'max'). If\n\
627specified 'max:min', a warning status will be generated if the\n\
628count is inside the specified range\n\n"));
629
630 printf(_("\
631This plugin checks the number of currently running processes and\n\
632generates WARNING or CRITICAL states if the process count is outside\n\
633the specified threshold ranges. The process count can be filtered by\n\
634process owner, parent process PID, current state (e.g., 'Z'), or may\n\
635be the total number of running processes\n\n"));
636
637 printf(_("\
638Examples:\n\
639 check_procs -w 2:2 -c 2:1024 -C portsentry\n\
640 Warning if not two processes with command name portsentry. Critical\n\
641 if < 2 or > 1024 processes\n\n\
642 check_procs -w 10 -a '/usr/local/bin/perl' -u root\n\
643 Warning alert if > 10 processes with command arguments containing \n\
644 '/usr/local/bin/perl' and owned by root\n\n\
645 check_procs -w 50000 -c 100000 --metric=VSZ\n\
646 Alert if vsz of any processes over 50K or 100K\n\n"));
647
648 printf (_(UT_SUPPORT));
635} 649}
636 650
637void 651void
638print_usage (void) 652print_usage (void)
639{ 653{
640 printf ("Usage:\n" " %s %s\n" 654 printf ("\
641 " %s (-h | --help) for detailed help\n" 655Usage: %s -w <range> -c <range> [-m metric] [-s state] [-p ppid]\n\
642 " %s (-V | --version) for version information\n", 656 [-u user] [-r rss] [-z vsz] [-P %%cpu] [-a argument-array]\n\
643 progname, OPTIONS, progname, progname); 657 [-C command] [-v]\n", progname);
658 printf (_(UT_HLP_VRS), progname, progname);
644} 659}
660