Code

Fix for zombie processes on Solaris (Bug 677803 - Matthew Brown)
authorTon Voon <tonvoon@users.sourceforge.net>
Fri, 31 Jan 2003 18:40:40 +0000 (18:40 +0000)
committerTon Voon <tonvoon@users.sourceforge.net>
Fri, 31 Jan 2003 18:40:40 +0000 (18:40 +0000)
git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@277 f882894a-f735-0410-b71e-b25c423dba1c

plugins/check_procs.c

index 05318b6a49a03233168d535e86528148d833d18c..755ed8609814b3aefcd5dc7787bf1ea26321bc7c 100644 (file)
@@ -77,6 +77,7 @@ char *prog = "";
 char *args = "";
 char *fmt = "";
 char tmp[MAX_INPUT_BUFFER];
+const char *zombie = "Z";
 
 int
 main (int argc, char **argv)
@@ -93,6 +94,7 @@ main (int argc, char **argv)
        int found = 0; /* counter for number of lines returned in `ps` output */
        int procs = 0; /* counter for number of processes meeting filter criteria */
        int pos; /* number of spaces before 'args' in `ps` output */
+       int cols; /* number of columns in ps output */
 
        int result = STATE_UNKNOWN;
 
@@ -115,14 +117,18 @@ main (int argc, char **argv)
        fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process);
 
        while (fgets (input_buffer, MAX_INPUT_BUFFER - 1, child_process)) {
-               if (
 #ifdef USE_PS_VARS
-                                sscanf (input_buffer, PS_FORMAT, PS_VARLIST) >= 4
+               cols = sscanf (input_buffer, PS_FORMAT, PS_VARLIST);
 #else
-                                sscanf (input_buffer, PS_FORMAT, procstat, &procuid, &procppid, &pos,
-                                                                procprog) >= 4
+               cols = sscanf (input_buffer, PS_FORMAT, procstat, &procuid, 
+                                                       &procppid, &pos, procprog);
 #endif
-                       ) {
+               /* Zombie processes do not give a procprog command */
+               if ( cols == 3 && strstr(procstat, zombie) ) {
+                       strcpy(procprog, "");
+                       cols = 4;
+               }
+               if ( cols >= 4 ) {
                        found++;
                        resultsum = 0;
                        asprintf (&procargs, "%s", input_buffer + pos);
@@ -147,6 +153,10 @@ main (int argc, char **argv)
 #endif
                        if (options == resultsum)
                                procs++;
+               } 
+               /* This should not happen */
+               else if (verbose) {
+                       printf("Not parseable: %s", input_buffer);
                }
        }