@cryptotaxi247 / netdata-1 / commits / d38d11580

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 */