}
if(tc_child_pid) {
- debug(D_EXIT, "Killing tc-qos-helper procees");
- kill(tc_child_pid, SIGTERM);
- waitid(tc_child_pid, 0, &info, WEXITED);
+ if(kill(tc_child_pid, 0) != -1) {
+ info("Killing tc-qos-helper procees");
+ kill(tc_child_pid, SIGTERM);
+ waitid(tc_child_pid, 0, &info, WEXITED);
+ }
}
tc_child_pid = 0;
pthread_join(cd->thread, NULL);
if(cd->pid && !cd->obsolete) {
- debug(D_EXIT, "killing %s plugin process", cd->id);
- kill(cd->pid, SIGTERM);
- waitid(cd->pid, 0, &info, WEXITED);
+ if(kill(cd->pid, 0) != -1) {
+ debug(D_EXIT, "killing %s plugin process", cd->id);
+ kill(cd->pid, SIGTERM);
+ waitid(cd->pid, 0, &info, WEXITED);
+ }
}
}
if(!dimension || !*dimension) {
error("PLUGINSD: '%s' is requesting a SET on chart '%s', like this: 'SET %s = %s'. Disabling it.", cd->fullfilename, st->id, dimension?dimension:"<nothing>", value?value:"<nothing>");
cd->enabled = 0;
- kill(cd->pid, SIGTERM);
+ // test: killing an exited child kills us - lets check it exists before killing it
+ if(kill(cd->pid, 0) != -1) kill(cd->pid, SIGTERM);
break;
}
if(!st) {
error("PLUGINSD: '%s' is requesting a SET on dimension %s with value %s, without a BEGIN. Disabling it.", cd->fullfilename, dimension, value);
cd->enabled = 0;
- kill(cd->pid, SIGTERM);
+ // test: killing an exited child kills us - lets check it exists before killing it
+ if(kill(cd->pid, 0) != -1) kill(cd->pid, SIGTERM);
break;
}
if(!id) {
error("PLUGINSD: '%s' is requesting a BEGIN without a chart id. Disabling it.", cd->fullfilename);
cd->enabled = 0;
- kill(cd->pid, SIGTERM);
+ // test: killing an exited child kills us - lets check it exists before killing it
+ if(kill(cd->pid, 0) != -1) kill(cd->pid, SIGTERM);
break;
}
if(!st) {
error("PLUGINSD: '%s' is requesting a BEGIN on chart '%s', which does not exist. Disabling it.", cd->fullfilename, id);
cd->enabled = 0;
- kill(cd->pid, SIGTERM);
+ // test: killing an exited child kills us - lets check it exists before killing it
+ if(kill(cd->pid, 0) != -1) kill(cd->pid, SIGTERM);
break;
}
if(!st) {
error("PLUGINSD: '%s' is requesting an END, without a BEGIN. Disabling it.", cd->fullfilename);
cd->enabled = 0;
- kill(cd->pid, SIGTERM);
+ // test: killing an exited child kills us - lets check it exists before killing it
+ if(kill(cd->pid, 0) != -1) kill(cd->pid, SIGTERM);
break;
}
if(!type || !*type || !id || !*id) {
error("PLUGINSD: '%s' is requesting a CHART, without a type.id. Disabling it.", cd->fullfilename);
cd->enabled = 0;
- kill(cd->pid, SIGTERM);
+ // test: killing an exited child kills us - lets check it exists before killing it
+ if(kill(cd->pid, 0) != -1) kill(cd->pid, SIGTERM);
break;
}
if(!id || !*id) {
error("PLUGINSD: '%s' is requesting a DIMENSION, without an id. Disabling it.", cd->fullfilename);
cd->enabled = 0;
- kill(cd->pid, SIGTERM);
+ // test: killing an exited child kills us - lets check it exists before killing it
+ if(kill(cd->pid, 0) != -1) kill(cd->pid, SIGTERM);
break;
}
if(!st) {
error("PLUGINSD: '%s' is requesting a DIMENSION, without a CHART. Disabling it.", cd->fullfilename);
cd->enabled = 0;
- kill(cd->pid, SIGTERM);
+ // test: killing an exited child kills us - lets check it exists before killing it
+ if(kill(cd->pid, 0) != -1) kill(cd->pid, SIGTERM);
break;
}
else if(hash == DISABLE_HASH && !strcmp(s, "DISABLE")) {
error("PLUGINSD: '%s' called DISABLE. Disabling it.", cd->fullfilename);
cd->enabled = 0;
- kill(cd->pid, SIGTERM);
+ // test: killing an exited child kills us - lets check it exists before killing it
+ if(kill(cd->pid, 0) != -1) kill(cd->pid, SIGTERM);
break;
}
#ifdef DETACH_PLUGINS_FROM_NETDATA
error("PLUGINSD: %s sleeping for %llu. Will kill with SIGCONT pid %d to wake it up.\n", cd->fullfilename, susec, cd->pid);
usleep(susec);
- kill(cd->pid, SIGCONT);
+ // test: killing an exited child kills us - lets check it exists before killing it
+ if(kill(cd->pid, 0) != -1) kill(cd->pid, SIGCONT);
bcopy(&now, &last, sizeof(struct timeval));
break;
}
else {
error("PLUGINSD: '%s' is sending command '%s' which is not known by netdata. Disabling it.", cd->fullfilename, s);
cd->enabled = 0;
- kill(cd->pid, SIGTERM);
+ // test: killing an exited child kills us - lets check it exists before killing it
+ if(kill(cd->pid, 0) != -1) kill(cd->pid, SIGTERM);
break;
}
}
if(!count && cd->enabled) {
error("PLUGINSD: '%s' does not generate usefull output. Disabling it.", cd->fullfilename);
cd->enabled = 0;
- kill(cd->pid, SIGTERM);
+ // test: killing an exited child kills us - lets check it exists before killing it
+ if(kill(cd->pid, 0) != -1) kill(cd->pid, SIGTERM);
}
if(cd->enabled) sleep(cd->update_every);