X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=plugins%2Fcheck_procs.c;h=3f40e087c51ed6f4c92131deb62498a1d9d896f0;hb=9d878eab82bede19e80b4aa9ce1409da3ba6d658;hp=a8a7d5e8f5f155454f4400832ae650de166ed45f;hpb=f0336fc9accee63c1500ec735944d936259865ea;p=nagiosplug.git diff --git a/plugins/check_procs.c b/plugins/check_procs.c index a8a7d5e..3f40e08 100644 --- a/plugins/check_procs.c +++ b/plugins/check_procs.c @@ -85,16 +85,20 @@ main (int argc, char **argv) char *input_line; char *procprog; + pid_t mypid = 0; int procuid = 0; + int procpid = 0; int procppid = 0; int procvsz = 0; int procrss = 0; int procseconds = 0; float procpcpu = 0; char procstat[8]; - char procetime[MAX_INPUT_BUFFER]; + char procetime[MAX_INPUT_BUFFER] = { '\0' }; char *procargs; +#ifdef HAVE_BASENAME char *temp_string; +#endif const char *zombie = "Z"; @@ -107,7 +111,6 @@ main (int argc, char **argv) int warn = 0; /* number of processes in warn state */ int crit = 0; /* number of processes in crit state */ int i = 0; - int result = STATE_UNKNOWN; setlocale (LC_ALL, ""); @@ -120,9 +123,12 @@ main (int argc, char **argv) asprintf (&metric_name, "PROCS"); metric = METRIC_PROCS; - if (process_arguments (argc, argv) != TRUE) + if (process_arguments (argc, argv) == ERROR) usage4 (_("Could not parse arguments")); + /* get our pid */ + mypid = getpid(); + /* Set signal handling and alarm timeout */ if (signal (SIGALRM, popen_timeout_alarm_handler) == SIG_ERR) { usage4 (_("Cannot catch SIGALRM")); @@ -172,25 +178,22 @@ main (int argc, char **argv) strip (procargs); /* Some ps return full pathname for command. This removes path */ - temp_string = strtok ((char *)procprog, "/"); - while (temp_string) { - strcpy(procprog, temp_string); - temp_string = strtok (NULL, "/"); - } +#ifdef HAVE_BASENAME + temp_string = strdup(procprog); + procprog = basename(temp_string); +#endif /* HAVE_BASENAME */ /* we need to convert the elapsed time to seconds */ procseconds = convert_to_seconds(procetime); if (verbose >= 3) - printf ("%d %d %d %d %d %.2f %s %s %s %s\n", + printf ("%d %d %d %d %d %d %.2f %s %s %s %s\n", procs, procuid, procvsz, procrss, - procppid, procpcpu, procstat, + procpid, procppid, procpcpu, procstat, procetime, procprog, procargs); /* Ignore self */ - if (strcmp (procprog, progname) == 0) { - continue; - } + if (mypid == procpid) continue; if ((options & STAT) && (strstr (statopts, procstat))) resultsum |= STAT; @@ -249,7 +252,7 @@ main (int argc, char **argv) /* If we get anything on STDERR, at least set warning */ while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_stderr)) { if (verbose) - printf (_("STDERR: %s"), input_buffer); + printf ("STDERR: %s", input_buffer); result = max_state (result, STATE_WARNING); printf (_("System call sent warnings to stderr\n")); } @@ -288,7 +291,7 @@ main (int argc, char **argv) printf (_("%d crit, %d warn out of "), crit, warn); } } - printf ("%d %s", procs, procs == 1 ? _("process") : _("processes")); + printf (ngettext ("%d process", "%d processes", (unsigned long) procs), procs); if (strcmp(fmt,"") != 0) { printf (_(" with %s"), fmt); @@ -343,9 +346,7 @@ process_arguments (int argc, char **argv) switch (c) { case '?': /* help */ - printf (_("%s: Unknown argument: %s\n\n"), progname, optarg); - print_usage (); - exit (STATE_UNKNOWN); + usage2 (_("Unknown argument"), optarg); case 'h': /* help */ print_help (); exit (STATE_OK); @@ -368,7 +369,7 @@ process_arguments (int argc, char **argv) else if (sscanf (optarg, "%d:", &cmin) == 1) break; else - usage (_("Critical Process Count must be an integer!\n\n")); + usage4 (_("Critical Process Count must be an integer!")); break; case 'w': /* warning threshold */ if (is_integer (optarg)) @@ -380,7 +381,7 @@ process_arguments (int argc, char **argv) else if (sscanf (optarg, "%d:", &wmin) == 1) break; else - usage (_("Warning Process Count must be an integer!\n\n")); + usage4 (_("Warning Process Count must be an integer!")); break; case 'p': /* process id */ if (sscanf (optarg, "%d%[^0-9]", &ppid, tmp) == 1) { @@ -388,7 +389,7 @@ process_arguments (int argc, char **argv) options |= PPID; break; } - usage2 (_("%s: Parent Process ID must be an integer!\n\n"), progname); + usage4 (_("Parent Process ID must be an integer!")); case 's': /* status */ if (statopts) break; @@ -403,18 +404,18 @@ process_arguments (int argc, char **argv) pw = getpwuid ((uid_t) uid); /* check to be sure user exists */ if (pw == NULL) - usage2 (_("UID %s was not found\n"), optarg); + usage2 (_("UID %s was not found"), optarg); } else { pw = getpwnam (optarg); /* check to be sure user exists */ if (pw == NULL) - usage2 (_("User name %s was not found\n"), optarg); + usage2 (_("User name %s was not found"), optarg); /* then get uid */ uid = pw->pw_uid; } user = pw->pw_name; - asprintf (&fmt, _("%s%sUID = %d (%s)"), (fmt ? fmt : ""), (options ? ", " : ""), + asprintf (&fmt, "%s%sUID = %d (%s)", (fmt ? fmt : ""), (options ? ", " : ""), uid, user); options |= USER; break; @@ -434,31 +435,31 @@ process_arguments (int argc, char **argv) break; else args = optarg; - asprintf (&fmt, _("%s%sargs '%s'"), (fmt ? fmt : ""), (options ? ", " : ""), args); + asprintf (&fmt, "%s%sargs '%s'", (fmt ? fmt : ""), (options ? ", " : ""), args); options |= ARGS; break; case 'r': /* RSS */ if (sscanf (optarg, "%d%[^0-9]", &rss, tmp) == 1) { - asprintf (&fmt, _("%s%sRSS >= %d"), (fmt ? fmt : ""), (options ? ", " : ""), rss); + asprintf (&fmt, "%s%sRSS >= %d", (fmt ? fmt : ""), (options ? ", " : ""), rss); options |= RSS; break; } - usage2 (_("%s: RSS must be an integer!\n\n"), progname); + usage4 (_("RSS must be an integer!")); case 'z': /* VSZ */ if (sscanf (optarg, "%d%[^0-9]", &vsz, tmp) == 1) { - asprintf (&fmt, _("%s%sVSZ >= %d"), (fmt ? fmt : ""), (options ? ", " : ""), vsz); + asprintf (&fmt, "%s%sVSZ >= %d", (fmt ? fmt : ""), (options ? ", " : ""), vsz); options |= VSZ; break; } - usage2 (_("%s: VSZ must be an integer!\n\n"), progname); + usage4 (_("VSZ must be an integer!")); case 'P': /* PCPU */ /* TODO: -P 1.5.5 is accepted */ if (sscanf (optarg, "%f%[^0-9.]", &pcpu, tmp) == 1) { - asprintf (&fmt, _("%s%sPCPU >= %.2f"), (fmt ? fmt : ""), (options ? ", " : ""), pcpu); + asprintf (&fmt, "%s%sPCPU >= %.2f", (fmt ? fmt : ""), (options ? ", " : ""), pcpu); options |= PCPU; break; } - usage2 (_("%s: PCPU must be a float!\n\n"), progname); + usage4 (_("PCPU must be a float!")); case 'm': asprintf (&metric_name, "%s", optarg); if ( strcmp(optarg, "PROCS") == 0) { @@ -482,10 +483,7 @@ process_arguments (int argc, char **argv) break; } - printf (_("%s: metric must be one of PROCS, VSZ, RSS, CPU, ELAPSED!\n\n"), - progname); - print_usage (); - exit (STATE_UNKNOWN); + usage4 (_("Metric must be one of PROCS, VSZ, RSS, CPU, ELAPSED!")); case 'v': /* command */ verbose++; break; @@ -588,6 +586,68 @@ check_thresholds (int value) } +/* convert the elapsed time to seconds */ +int +convert_to_seconds(char *etime) { + + char *ptr; + int total; + + int hyphcnt; + int coloncnt; + int days; + int hours; + int minutes; + int seconds; + + hyphcnt = 0; + coloncnt = 0; + days = 0; + hours = 0; + minutes = 0; + seconds = 0; + + for (ptr = etime; *ptr != '\0'; ptr++) { + + if (*ptr == '-') { + hyphcnt++; + continue; + } + if (*ptr == ':') { + coloncnt++; + continue; + } + } + + if (hyphcnt > 0) { + sscanf(etime, "%d-%d:%d:%d", + &days, &hours, &minutes, &seconds); + /* linux 2.6.5/2.6.6 reporting some processes with infinite + * elapsed times for some reason */ + if (days == 49710) { + return 0; + } + } else { + if (coloncnt == 2) { + sscanf(etime, "%d:%d:%d", + &hours, &minutes, &seconds); + } else if (coloncnt == 1) { + sscanf(etime, "%d:%d", + &minutes, &seconds); + } + } + + total = (days * 86400) + + (hours * 3600) + + (minutes * 60) + + seconds; + + if (verbose >= 3 && metric == METRIC_ELAPSED) { + printf("seconds: %d\n", total); + } + return total; +} + void print_help (void) @@ -681,78 +741,11 @@ Examples:\n\ printf (_(UT_SUPPORT)); } - - -/* convert the elapsed time to seconds */ -int -convert_to_seconds(char *etime) { - - char *ptr; - int total; - - int hyphcnt; - int coloncnt; - int days; - int hours; - int minutes; - int seconds; - - hyphcnt = 0; - coloncnt = 0; - days = 0; - hours = 0; - minutes = 0; - seconds = 0; - - for (ptr = etime; *ptr != '\0'; ptr++) { - - if (*ptr == '-') { - hyphcnt++; - continue; - } - if (*ptr == ':') { - coloncnt++; - continue; - } - } - - if (hyphcnt > 0) { - sscanf(etime, "%d-%d:%d:%d", - &days, &hours, &minutes, &seconds); - /* linux 2.6.5/2.6.6 reporting some processes with infinite - * elapsed times for some reason */ - if (days == 49710) { - return 0; - } - } else { - if (coloncnt == 2) { - sscanf(etime, "%d:%d:%d", - &hours, &minutes, &seconds); - } else if (coloncnt == 1) { - sscanf(etime, "%d:%d", - &minutes, &seconds); - } - } - - total = (days * 86400) + - (hours * 3600) + - (minutes * 60) + - seconds; - - if (verbose >= 3) { - printf("seconds: %d\n", total); - } - return total; -} - void print_usage (void) { printf ("\ Usage: %s -w -c [-m metric] [-s state] [-p ppid]\n\ - [-u user] [-r rss] [-z vsz] [-P %%cpu] [-a argument-array]\n\ - [-C command] [-t timeout] [-v]\n", progname); - printf (_(UT_HLP_VRS), progname, progname); + [-u user] [-r rss] [-z vsz] [-P %%cpu] [-a argument-array]\n\ + [-C command] [-t timeout] [-v]\n", progname); } - -