summaryrefslogtreecommitdiffstats
path: root/plugins/check_procs.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/check_procs.c')
-rw-r--r--plugins/check_procs.c93
1 files changed, 61 insertions, 32 deletions
diff --git a/plugins/check_procs.c b/plugins/check_procs.c
index 83e6864e..ae6e9c23 100644
--- a/plugins/check_procs.c
+++ b/plugins/check_procs.c
@@ -77,8 +77,8 @@ void print_usage(void);
77#define EREG_ARGS 1024 77#define EREG_ARGS 1024
78#define EXCLUDE_PROGS 2048 78#define EXCLUDE_PROGS 2048
79 79
80#define KTHREAD_PARENT \ 80#define KTHREAD_PARENT \
81 "kthreadd" /* the parent process of kernel threads: \ 81 "kthreadd" /* the parent process of kernel threads: \
82 ppid of procs are compared to pid of this proc*/ 82 ppid of procs are compared to pid of this proc*/
83 83
84static int verbose = 0; 84static int verbose = 0;
@@ -197,14 +197,17 @@ int main(int argc, char **argv) {
197 procseconds = convert_to_seconds(procetime, config.metric); 197 procseconds = convert_to_seconds(procetime, config.metric);
198 198
199 if (verbose >= 3) { 199 if (verbose >= 3) {
200 printf("proc#=%d uid=%d vsz=%d rss=%d pid=%d ppid=%d pcpu=%.2f stat=%s etime=%s prog=%s args=%s\n", procs, procuid, procvsz, 200 printf("proc#=%d uid=%d vsz=%d rss=%d pid=%d ppid=%d pcpu=%.2f stat=%s etime=%s "
201 procrss, procpid, procppid, procpcpu, procstat, procetime, procprog, procargs); 201 "prog=%s args=%s\n",
202 procs, procuid, procvsz, procrss, procpid, procppid, procpcpu, procstat,
203 procetime, procprog, procargs);
202 } 204 }
203 205
204 /* Ignore self */ 206 /* Ignore self */
205 int ret = 0; 207 int ret = 0;
206 if ((config.usepid && mypid == procpid) || 208 if ((config.usepid && mypid == procpid) ||
207 (((!config.usepid) && ((ret = stat_exe(procpid, &statbuf) != -1) && statbuf.st_dev == mydev && statbuf.st_ino == myino)) || 209 (((!config.usepid) && ((ret = stat_exe(procpid, &statbuf) != -1) &&
210 statbuf.st_dev == mydev && statbuf.st_ino == myino)) ||
208 (ret == -1 && errno == ENOENT))) { 211 (ret == -1 && errno == ENOENT))) {
209 if (verbose >= 3) { 212 if (verbose >= 3) {
210 printf("not considering - is myself or gone\n"); 213 printf("not considering - is myself or gone\n");
@@ -255,7 +258,8 @@ int main(int argc, char **argv) {
255 258
256 if (kthread_ppid == procppid) { 259 if (kthread_ppid == procppid) {
257 if (verbose >= 2) { 260 if (verbose >= 2) {
258 printf("Ignore kernel thread: pid=%d ppid=%d prog=%s args=%s\n", procpid, procppid, procprog, procargs); 261 printf("Ignore kernel thread: pid=%d ppid=%d prog=%s args=%s\n", procpid,
262 procppid, procprog, procargs);
259 } 263 }
260 continue; 264 continue;
261 } 265 }
@@ -267,7 +271,8 @@ int main(int argc, char **argv) {
267 if ((config.options & ARGS) && procargs && (strstr(procargs, config.args) != NULL)) { 271 if ((config.options & ARGS) && procargs && (strstr(procargs, config.args) != NULL)) {
268 resultsum |= ARGS; 272 resultsum |= ARGS;
269 } 273 }
270 if ((config.options & EREG_ARGS) && procargs && (regexec(&config.re_args, procargs, (size_t)0, NULL, 0) == 0)) { 274 if ((config.options & EREG_ARGS) && procargs &&
275 (regexec(&config.re_args, procargs, (size_t)0, NULL, 0) == 0)) {
271 resultsum |= EREG_ARGS; 276 resultsum |= EREG_ARGS;
272 } 277 }
273 if ((config.options & PROG) && procprog && (strcmp(config.prog, procprog) == 0)) { 278 if ((config.options & PROG) && procprog && (strcmp(config.prog, procprog) == 0)) {
@@ -298,8 +303,10 @@ int main(int argc, char **argv) {
298 303
299 procs++; 304 procs++;
300 if (verbose >= 2) { 305 if (verbose >= 2) {
301 printf("Matched: uid=%d vsz=%d rss=%d pid=%d ppid=%d pcpu=%.2f stat=%s etime=%s prog=%s args=%s\n", procuid, procvsz, 306 printf("Matched: uid=%d vsz=%d rss=%d pid=%d ppid=%d pcpu=%.2f stat=%s etime=%s "
302 procrss, procpid, procppid, procpcpu, procstat, procetime, procprog, procargs); 307 "prog=%s args=%s\n",
308 procuid, procvsz, procrss, procpid, procppid, procpcpu, procstat, procetime,
309 procprog, procargs);
303 } 310 }
304 311
305 mp_state_enum temporary_result = STATE_OK; 312 mp_state_enum temporary_result = STATE_OK;
@@ -318,12 +325,14 @@ int main(int argc, char **argv) {
318 if (config.metric != METRIC_PROCS) { 325 if (config.metric != METRIC_PROCS) {
319 if (temporary_result == STATE_WARNING) { 326 if (temporary_result == STATE_WARNING) {
320 warn++; 327 warn++;
321 xasprintf(&config.fails, "%s%s%s", config.fails, (strcmp(config.fails, "") ? ", " : ""), procprog); 328 xasprintf(&config.fails, "%s%s%s", config.fails,
329 (strcmp(config.fails, "") ? ", " : ""), procprog);
322 result = max_state(result, temporary_result); 330 result = max_state(result, temporary_result);
323 } 331 }
324 if (temporary_result == STATE_CRITICAL) { 332 if (temporary_result == STATE_CRITICAL) {
325 crit++; 333 crit++;
326 xasprintf(&config.fails, "%s%s%s", config.fails, (strcmp(config.fails, "") ? ", " : ""), procprog); 334 xasprintf(&config.fails, "%s%s%s", config.fails,
335 (strcmp(config.fails, "") ? ", " : ""), procprog);
327 result = max_state(result, temporary_result); 336 result = max_state(result, temporary_result);
328 } 337 }
329 } 338 }
@@ -420,7 +429,8 @@ check_procs_config_wrapper process_arguments(int argc, char **argv) {
420 429
421 while (true) { 430 while (true) {
422 int option = 0; 431 int option = 0;
423 int option_index = getopt_long(argc, argv, "Vvhkt:c:w:p:s:u:C:a:z:r:m:P:T:X:", longopts, &option); 432 int option_index =
433 getopt_long(argc, argv, "Vvhkt:c:w:p:s:u:C:a:z:r:m:P:T:X:", longopts, &option);
424 434
425 if (option_index == -1 || option_index == EOF) { 435 if (option_index == -1 || option_index == EOF) {
426 break; 436 break;
@@ -451,7 +461,8 @@ check_procs_config_wrapper process_arguments(int argc, char **argv) {
451 case 'p': { /* process id */ 461 case 'p': { /* process id */
452 static char tmp[MAX_INPUT_BUFFER]; 462 static char tmp[MAX_INPUT_BUFFER];
453 if (sscanf(optarg, "%d%[^0-9]", &result.config.ppid, tmp) == 1) { 463 if (sscanf(optarg, "%d%[^0-9]", &result.config.ppid, tmp) == 1) {
454 xasprintf(&result.config.fmt, "%s%sPPID = %d", (result.config.fmt ? result.config.fmt : ""), 464 xasprintf(&result.config.fmt, "%s%sPPID = %d",
465 (result.config.fmt ? result.config.fmt : ""),
455 (result.config.options ? ", " : ""), result.config.ppid); 466 (result.config.options ? ", " : ""), result.config.ppid);
456 result.config.options |= PPID; 467 result.config.options |= PPID;
457 break; 468 break;
@@ -464,7 +475,8 @@ check_procs_config_wrapper process_arguments(int argc, char **argv) {
464 } else { 475 } else {
465 result.config.statopts = optarg; 476 result.config.statopts = optarg;
466 } 477 }
467 xasprintf(&result.config.fmt, _("%s%sSTATE = %s"), (result.config.fmt ? result.config.fmt : ""), 478 xasprintf(&result.config.fmt, _("%s%sSTATE = %s"),
479 (result.config.fmt ? result.config.fmt : ""),
468 (result.config.options ? ", " : ""), result.config.statopts); 480 (result.config.options ? ", " : ""), result.config.statopts);
469 result.config.options |= STAT; 481 result.config.options |= STAT;
470 break; 482 break;
@@ -488,7 +500,8 @@ check_procs_config_wrapper process_arguments(int argc, char **argv) {
488 } 500 }
489 501
490 char *user = pw->pw_name; 502 char *user = pw->pw_name;
491 xasprintf(&result.config.fmt, "%s%sUID = %d (%s)", (result.config.fmt ? result.config.fmt : ""), 503 xasprintf(&result.config.fmt, "%s%sUID = %d (%s)",
504 (result.config.fmt ? result.config.fmt : ""),
492 (result.config.options ? ", " : ""), result.config.uid, user); 505 (result.config.options ? ", " : ""), result.config.uid, user);
493 result.config.options |= USER; 506 result.config.options |= USER;
494 } break; 507 } break;
@@ -499,7 +512,8 @@ check_procs_config_wrapper process_arguments(int argc, char **argv) {
499 } else { 512 } else {
500 result.config.prog = optarg; 513 result.config.prog = optarg;
501 } 514 }
502 xasprintf(&result.config.fmt, _("%s%scommand name '%s'"), (result.config.fmt ? result.config.fmt : ""), 515 xasprintf(&result.config.fmt, _("%s%scommand name '%s'"),
516 (result.config.fmt ? result.config.fmt : ""),
503 (result.config.options ? ", " : ""), result.config.prog); 517 (result.config.options ? ", " : ""), result.config.prog);
504 result.config.options |= PROG; 518 result.config.options |= PROG;
505 break; 519 break;
@@ -509,14 +523,17 @@ check_procs_config_wrapper process_arguments(int argc, char **argv) {
509 } else { 523 } else {
510 result.config.exclude_progs = optarg; 524 result.config.exclude_progs = optarg;
511 } 525 }
512 xasprintf(&result.config.fmt, _("%s%sexclude progs '%s'"), (result.config.fmt ? result.config.fmt : ""), 526 xasprintf(&result.config.fmt, _("%s%sexclude progs '%s'"),
527 (result.config.fmt ? result.config.fmt : ""),
513 (result.config.options ? ", " : ""), result.config.exclude_progs); 528 (result.config.options ? ", " : ""), result.config.exclude_progs);
514 char *tmp_pointer = strtok(result.config.exclude_progs, ","); 529 char *tmp_pointer = strtok(result.config.exclude_progs, ",");
515 530
516 while (tmp_pointer) { 531 while (tmp_pointer) {
517 result.config.exclude_progs_arr = 532 result.config.exclude_progs_arr =
518 realloc(result.config.exclude_progs_arr, sizeof(char *) * ++result.config.exclude_progs_counter); 533 realloc(result.config.exclude_progs_arr,
519 result.config.exclude_progs_arr[result.config.exclude_progs_counter - 1] = tmp_pointer; 534 sizeof(char *) * ++result.config.exclude_progs_counter);
535 result.config.exclude_progs_arr[result.config.exclude_progs_counter - 1] =
536 tmp_pointer;
520 tmp_pointer = strtok(NULL, ","); 537 tmp_pointer = strtok(NULL, ",");
521 } 538 }
522 539
@@ -529,7 +546,8 @@ check_procs_config_wrapper process_arguments(int argc, char **argv) {
529 } else { 546 } else {
530 result.config.args = optarg; 547 result.config.args = optarg;
531 } 548 }
532 xasprintf(&result.config.fmt, "%s%sargs '%s'", (result.config.fmt ? result.config.fmt : ""), 549 xasprintf(&result.config.fmt, "%s%sargs '%s'",
550 (result.config.fmt ? result.config.fmt : ""),
533 (result.config.options ? ", " : ""), result.config.args); 551 (result.config.options ? ", " : ""), result.config.args);
534 result.config.options |= ARGS; 552 result.config.options |= ARGS;
535 break; 553 break;
@@ -539,7 +557,8 @@ check_procs_config_wrapper process_arguments(int argc, char **argv) {
539 if (err != 0) { 557 if (err != 0) {
540 char errbuf[MAX_INPUT_BUFFER]; 558 char errbuf[MAX_INPUT_BUFFER];
541 regerror(err, &result.config.re_args, errbuf, MAX_INPUT_BUFFER); 559 regerror(err, &result.config.re_args, errbuf, MAX_INPUT_BUFFER);
542 die(STATE_UNKNOWN, "PROCS %s: %s - %s\n", _("UNKNOWN"), _("Could not compile regular expression"), errbuf); 560 die(STATE_UNKNOWN, "PROCS %s: %s - %s\n", _("UNKNOWN"),
561 _("Could not compile regular expression"), errbuf);
543 } 562 }
544 /* Strip off any | within the regex optarg */ 563 /* Strip off any | within the regex optarg */
545 char *temp_string = strdup(optarg); 564 char *temp_string = strdup(optarg);
@@ -550,14 +569,16 @@ check_procs_config_wrapper process_arguments(int argc, char **argv) {
550 } 569 }
551 index++; 570 index++;
552 } 571 }
553 xasprintf(&result.config.fmt, "%s%sregex args '%s'", (result.config.fmt ? result.config.fmt : ""), 572 xasprintf(&result.config.fmt, "%s%sregex args '%s'",
573 (result.config.fmt ? result.config.fmt : ""),
554 (result.config.options ? ", " : ""), temp_string); 574 (result.config.options ? ", " : ""), temp_string);
555 result.config.options |= EREG_ARGS; 575 result.config.options |= EREG_ARGS;
556 } break; 576 } break;
557 case 'r': { /* RSS */ 577 case 'r': { /* RSS */
558 static char tmp[MAX_INPUT_BUFFER]; 578 static char tmp[MAX_INPUT_BUFFER];
559 if (sscanf(optarg, "%d%[^0-9]", &result.config.rss, tmp) == 1) { 579 if (sscanf(optarg, "%d%[^0-9]", &result.config.rss, tmp) == 1) {
560 xasprintf(&result.config.fmt, "%s%sRSS >= %d", (result.config.fmt ? result.config.fmt : ""), 580 xasprintf(&result.config.fmt, "%s%sRSS >= %d",
581 (result.config.fmt ? result.config.fmt : ""),
561 (result.config.options ? ", " : ""), result.config.rss); 582 (result.config.options ? ", " : ""), result.config.rss);
562 result.config.options |= RSS; 583 result.config.options |= RSS;
563 break; 584 break;
@@ -567,7 +588,8 @@ check_procs_config_wrapper process_arguments(int argc, char **argv) {
567 case 'z': { /* VSZ */ 588 case 'z': { /* VSZ */
568 static char tmp[MAX_INPUT_BUFFER]; 589 static char tmp[MAX_INPUT_BUFFER];
569 if (sscanf(optarg, "%d%[^0-9]", &result.config.vsz, tmp) == 1) { 590 if (sscanf(optarg, "%d%[^0-9]", &result.config.vsz, tmp) == 1) {
570 xasprintf(&result.config.fmt, "%s%sVSZ >= %d", (result.config.fmt ? result.config.fmt : ""), 591 xasprintf(&result.config.fmt, "%s%sVSZ >= %d",
592 (result.config.fmt ? result.config.fmt : ""),
571 (result.config.options ? ", " : ""), result.config.vsz); 593 (result.config.options ? ", " : ""), result.config.vsz);
572 result.config.options |= VSZ; 594 result.config.options |= VSZ;
573 break; 595 break;
@@ -578,7 +600,8 @@ check_procs_config_wrapper process_arguments(int argc, char **argv) {
578 /* TODO: -P 1.5.5 is accepted */ 600 /* TODO: -P 1.5.5 is accepted */
579 static char tmp[MAX_INPUT_BUFFER]; 601 static char tmp[MAX_INPUT_BUFFER];
580 if (sscanf(optarg, "%f%[^0-9.]", &result.config.pcpu, tmp) == 1) { 602 if (sscanf(optarg, "%f%[^0-9.]", &result.config.pcpu, tmp) == 1) {
581 xasprintf(&result.config.fmt, "%s%sPCPU >= %.2f", (result.config.fmt ? result.config.fmt : ""), 603 xasprintf(&result.config.fmt, "%s%sPCPU >= %.2f",
604 (result.config.fmt ? result.config.fmt : ""),
582 (result.config.options ? ", " : ""), result.config.pcpu); 605 (result.config.options ? ", " : ""), result.config.pcpu);
583 result.config.options |= PCPU; 606 result.config.options |= PCPU;
584 break; 607 break;
@@ -633,13 +656,15 @@ check_procs_config_wrapper process_arguments(int argc, char **argv) {
633 } 656 }
634 if (result.config.statopts == NULL && argv[index]) { 657 if (result.config.statopts == NULL && argv[index]) {
635 xasprintf(&result.config.statopts, "%s", argv[index++]); 658 xasprintf(&result.config.statopts, "%s", argv[index++]);
636 xasprintf(&result.config.fmt, _("%s%sSTATE = %s"), (result.config.fmt ? result.config.fmt : ""), 659 xasprintf(&result.config.fmt, _("%s%sSTATE = %s"),
637 (result.config.options ? ", " : ""), result.config.statopts); 660 (result.config.fmt ? result.config.fmt : ""), (result.config.options ? ", " : ""),
661 result.config.statopts);
638 result.config.options |= STAT; 662 result.config.options |= STAT;
639 } 663 }
640 664
641 /* this will abort in case of invalid ranges */ 665 /* this will abort in case of invalid ranges */
642 set_thresholds(&result.config.procs_thresholds, result.config.warning_range, result.config.critical_range); 666 set_thresholds(&result.config.procs_thresholds, result.config.warning_range,
667 result.config.critical_range);
643 668
644 return validate_arguments(result); 669 return validate_arguments(result);
645} 670}
@@ -722,13 +747,17 @@ void print_help(void) {
722 printf("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>\n"); 747 printf("Copyright (c) 1999 Ethan Galstad <nagios@nagios.org>\n");
723 printf(COPYRIGHT, copyright, email); 748 printf(COPYRIGHT, copyright, email);
724 749
725 printf("%s\n", _("Checks all processes and generates WARNING or CRITICAL states if the specified")); 750 printf("%s\n",
726 printf("%s\n", _("metric is outside the required threshold ranges. The metric defaults to number")); 751 _("Checks all processes and generates WARNING or CRITICAL states if the specified"));
727 printf("%s\n", _("of processes. Search filters can be applied to limit the processes to check.")); 752 printf("%s\n",
753 _("metric is outside the required threshold ranges. The metric defaults to number"));
754 printf("%s\n",
755 _("of processes. Search filters can be applied to limit the processes to check."));
728 756
729 printf("\n\n"); 757 printf("\n\n");
730 758
731 printf("%s\n", _("The parent process, check_procs itself and any child process of check_procs (ps)")); 759 printf("%s\n",
760 _("The parent process, check_procs itself and any child process of check_procs (ps)"));
732 printf("%s\n", _("are excluded from any checks to prevent false positives.")); 761 printf("%s\n", _("are excluded from any checks to prevent false positives."));
733 762
734 printf("\n\n"); 763 printf("\n\n");