Explorar el Código

Fix for zombie processes on Solaris (Bug 677803 - Matthew Brown)

git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@277 f882894a-f735-0410-b71e-b25c423dba1c
Ton Voon hace 23 años
padre
commit
89ec266178
Se han modificado 1 ficheros con 15 adiciones y 5 borrados
  1. 15 5
      plugins/check_procs.c

+ 15 - 5
plugins/check_procs.c

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