info("PLUGINSD: '%s' on pid %d stopped.", cd->fullfilename, cd->pid);
// fgets() failed or loop broke
- mypclose(fp, cd->pid);
- cd->pid = 0;
+ int code = mypclose(fp, cd->pid);
+ if(code == 1 || code == 127) {
+ // 1 = DISABLE
+ // 127 = cannot even run it
+ error("PLUGINSD: '%s' (pid %d) exited with code %d. Disabling it.", cd->fullfilename, cd->pid, code);
+ cd->enabled = 0;
+ }
if(netdata_exit) {
+ cd->pid = 0;
cd->enabled = 0;
cd->obsolete = 1;
return NULL;
sleep((unsigned int) (cd->update_every * 10));
}
+ cd->pid = 0;
if(likely(cd->enabled)) sleep((unsigned int) cd->update_every);
else break;
}
exit(1);
}
-void mypclose(FILE *fp, pid_t pid) {
+int mypclose(FILE *fp, pid_t pid) {
debug(D_EXIT, "Request to mypclose() on pid %d", pid);
/*mypopen_del(fp);*/
switch(info.si_code) {
case CLD_EXITED:
error("pid %d exited with code %d.", info.si_pid, info.si_status);
+ return(info.si_status);
break;
case CLD_KILLED:
error("pid %d killed by signal %d.", info.si_pid, info.si_status);
+ return(-1);
break;
case CLD_DUMPED:
error("pid %d core dumped by signal %d.", info.si_pid, info.si_status);
+ return(-2);
break;
case CLD_STOPPED:
error("pid %d stopped by signal %d.", info.si_pid, info.si_status);
+ return(0);
break;
case CLD_TRAPPED:
error("pid %d trapped by signal %d.", info.si_pid, info.si_status);
+ return(-4);
break;
case CLD_CONTINUED:
error("pid %d continued by signal %d.", info.si_pid, info.si_status);
+ return(0);
break;
default:
error("pid %d gave us a SIGCHLD with code %d and status %d.", info.si_pid, info.si_code, info.si_status);
+ return(-5);
break;
}
}
else error("Cannot waitid() for pid %d", pid);
+ return 0;
}
#define PIPE_WRITE 1
extern FILE *mypopen(const char *command, pid_t *pidptr);
-extern void mypclose(FILE *fp, pid_t pid);
+extern int mypclose(FILE *fp, pid_t pid);
#endif /* NETDATA_POPEN_H */