disable plugins based on their exit code
Costa Tsaousis (ktsaou) committed
Jan 7, 2016 at 12:47 UTC
d38d115801c6ef42d2a6d17942db29f6d9c59fe7
3 files changed
+19
-4
src/plugins_d.c
+9
-2
@@ -385,10 +385,16 @@ void *pluginsd_worker_thread(void *arg)
385
info("PLUGINSD: '%s' on pid %d stopped.", cd->fullfilename, cd->pid);
386
387
// fgets() failed or loop broke
388
- mypclose(fp, cd->pid);
389
- cd->pid = 0;
388
+ int code = mypclose(fp, cd->pid);
389
+ if(code == 1 || code == 127) {
390
+ // 1 = DISABLE
391
+ // 127 = cannot even run it
392
+ error("PLUGINSD: '%s' (pid %d) exited with code %d. Disabling it.", cd->fullfilename, cd->pid, code);
393
+ cd->enabled = 0;
394
+ }
395
396
if(netdata_exit) {
397
+ cd->pid = 0;
398
cd->enabled = 0;
399
cd->obsolete = 1;
400
return NULL;
@@ -399,6 +405,7 @@ void *pluginsd_worker_thread(void *arg)
405
sleep((unsigned int) (cd->update_every * 10));
406
}
407
408
+ cd->pid = 0;
409
if(likely(cd->enabled)) sleep((unsigned int) cd->update_every);
410
else break;
411
}
src/popen.c
+9
-1
@@ -121,7 +121,7 @@ FILE *mypopen(const char *command, pid_t *pidptr)
121
exit(1);
122
}
123
124
-void mypclose(FILE *fp, pid_t pid) {
124
+int mypclose(FILE *fp, pid_t pid) {
125
debug(D_EXIT, "Request to mypclose() on pid %d", pid);
126
127
/*mypopen_del(fp);*/
@@ -132,32 +132,40 @@ void mypclose(FILE *fp, pid_t pid) {
132
switch(info.si_code) {
133
case CLD_EXITED:
134
error("pid %d exited with code %d.", info.si_pid, info.si_status);
135
+ return(info.si_status);
136
break;
137
138
case CLD_KILLED:
139
error("pid %d killed by signal %d.", info.si_pid, info.si_status);
140
+ return(-1);
141
break;
142
143
case CLD_DUMPED:
144
error("pid %d core dumped by signal %d.", info.si_pid, info.si_status);
145
+ return(-2);
146
break;
147
148
case CLD_STOPPED:
149
error("pid %d stopped by signal %d.", info.si_pid, info.si_status);
150
+ return(0);
151
break;
152
153
case CLD_TRAPPED:
154
error("pid %d trapped by signal %d.", info.si_pid, info.si_status);
155
+ return(-4);
156
break;
157
158
case CLD_CONTINUED:
159
error("pid %d continued by signal %d.", info.si_pid, info.si_status);
160
+ return(0);
161
break;
162
163
default:
164
error("pid %d gave us a SIGCHLD with code %d and status %d.", info.si_pid, info.si_code, info.si_status);
165
+ return(-5);
166
break;
167
}
168
}
169
else error("Cannot waitid() for pid %d", pid);
170
+ return 0;
171
}
src/popen.h
+1
-1
@@ -9,6 +9,6 @@
9
#define PIPE_WRITE 1
10
11
extern FILE *mypopen(const char *command, pid_t *pidptr);
12
-extern void mypclose(FILE *fp, pid_t pid);
12
+extern int mypclose(FILE *fp, pid_t pid);
13
14
#endif /* NETDATA_POPEN_H */