aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorGravatar Ton Voon <tonvoon@users.sourceforge.net> 2003-01-31 18:40:40 +0000
committerGravatar Ton Voon <tonvoon@users.sourceforge.net> 2003-01-31 18:40:40 +0000
commit89ec266178a3303e5a2c82f02a4155a34fd04b3f (patch)
tree6b892510c86bb63ab7387cb92ba9651607756f09 /plugins
parent7f323619baf41c48da52b2319e0a7c59a9125b1e (diff)
downloadmonitoring-plugins-89ec266178a3303e5a2c82f02a4155a34fd04b3f.tar.gz
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
Diffstat (limited to 'plugins')
-rw-r--r--plugins/check_procs.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/plugins/check_procs.c b/plugins/check_procs.c
index 05318b6a..755ed860 100644
--- a/plugins/check_procs.c
+++ b/plugins/check_procs.c
@@ -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);
}
}