static int check_respawn_thread(thread_t * thread) { pid_t pid; /* Fetch thread args */ pid = THREAD_CHILD_PID(thread); /* Restart respawning thread */ if (thread->type == THREAD_CHILD_TIMEOUT) { thread_add_child(master, check_respawn_thread, NULL, pid, RESPAWN_TIMER); return 0; } /* We catch a SIGCHLD, handle it */ if (!__test_bit(DONT_RESPAWN_BIT, &debug)) { log_message(LOG_ALERT, "Healthcheck child process(%d) died: Respawning", pid); start_check_child(); } else { log_message(LOG_ALERT, "Healthcheck child process(%d) died: Exiting", pid); raise(SIGTERM); } return 0; }
/* VRRP Child respawning thread */ int vrrp_respawn_thread(thread_t * thread) { pid_t pid; /* Fetch thread args */ pid = THREAD_CHILD_PID(thread); /* Restart respawning thread */ if (thread->type == THREAD_CHILD_TIMEOUT) { thread_add_child(master, vrrp_respawn_thread, NULL, pid, RESPAWN_TIMER); return 0; } /* We catch a SIGCHLD, handle it */ if (!(debug & 64)) { log_message(LOG_ALERT, "VRRP child process(%d) died: Respawning", pid); start_vrrp_child(); } else { log_message(LOG_ALERT, "VRRP child process(%d) died: Exiting", pid); raise(SIGTERM); } return 0; }
/* VRRP Child respawning thread */ int vrrp_respawn_thread(thread * thread_obj) { pid_t pid; /* Fetch thread args */ pid = THREAD_CHILD_PID(thread_obj); /* Restart respawning thread */ if (thread_obj->type == THREAD_CHILD_TIMEOUT) { thread_add_child(master, vrrp_respawn_thread, NULL, pid, RESPAWN_TIMER); return 0; } /* We catch a SIGCHLD, handle it */ log_message(LOG_INFO, "VRRP child process(%d) died: Respawning", pid); start_vrrp_child(); return 0; }
int misc_check_child_timeout_thread(thread * thread_obj) { pid_t pid; if (thread_obj->type != THREAD_CHILD_TIMEOUT) return 0; /* OK, it still hasn't exited. Now really kill it off. */ pid = THREAD_CHILD_PID(thread_obj); if (kill(pid, SIGKILL) < 0) { /* Its possible it finished while we're handing this */ if (errno != ESRCH) DBG("kill error: %s", strerror(errno)); return 0; } log_message(LOG_WARNING, "Process [%d] didn't respond to SIGTERM", pid); waitpid(pid, NULL, 0); return 0; }
int misc_check_child_thread(thread * thread_obj) { int wait_status; checker *checker_obj; misc_checker *misc_chk; checker_obj = THREAD_ARG(thread_obj); misc_chk = CHECKER_ARG(checker_obj); if (thread_obj->type == THREAD_CHILD_TIMEOUT) { pid_t pid; pid = THREAD_CHILD_PID(thread_obj); /* The child hasn't responded. Kill it off. */ if (svr_checker_up(checker_obj->id, checker_obj->rs)) { log_message(LOG_INFO, "Misc check to [%s] for [%s] timed out", inet_ntop2(CHECKER_RIP(checker_obj)), misc_chk->path); smtp_alert(checker_obj->rs, NULL, NULL, "DOWN", "=> MISC CHECK script timeout on service <="); update_svr_checker_state(DOWN, checker_obj->id , checker_obj->vs , checker_obj->rs); } kill(pid, SIGTERM); thread_add_child(thread_obj->master, misc_check_child_timeout_thread, checker_obj, pid, 2); return 0; } wait_status = THREAD_CHILD_STATUS(thread_obj); if (WIFEXITED(wait_status)) { int status; status = WEXITSTATUS(wait_status); if (status == 0 || (misc_chk->dynamic == 1 && status >= 2 && status <= 255)) { /* * The actual weight set when using misc_dynamic is two less than * the exit status returned. Effective range is 0..253. * Catch legacy case of status being 0 but misc_dynamic being set. */ if (misc_chk->dynamic == 1 && status != 0) update_svr_wgt(status - 2, checker_obj->vs, checker_obj->rs); /* everything is good */ if (!svr_checker_up(checker_obj->id, checker_obj->rs)) { log_message(LOG_INFO, "Misc check to [%s] for [%s] success.", inet_ntop2(CHECKER_RIP(checker_obj)), misc_chk->path); smtp_alert(checker_obj->rs, NULL, NULL, "UP", "=> MISC CHECK succeed on service <="); update_svr_checker_state(UP, checker_obj->id , checker_obj->vs , checker_obj->rs); } } else { if (svr_checker_up(checker_obj->id, checker_obj->rs)) { log_message(LOG_INFO, "Misc check to [%s] for [%s] failed.", inet_ntop2(CHECKER_RIP(checker_obj)), misc_chk->path); smtp_alert(checker_obj->rs, NULL, NULL, "DOWN", "=> MISC CHECK failed on service <="); update_svr_checker_state(DOWN, checker_obj->id , checker_obj->vs , checker_obj->rs); } } } return 0; }