parent
9dae4f2e38
commit
bebc604438
@ -184,13 +184,22 @@ static void re_exec_supervisor(void)
|
||||
static void handle_signal(int sig)
|
||||
{
|
||||
int serrno = errno;
|
||||
pid_t pid;
|
||||
|
||||
switch (sig) {
|
||||
case SIGALRM:
|
||||
do_healthcheck = 1;
|
||||
break;
|
||||
case SIGCHLD:
|
||||
if (exiting)
|
||||
while (waitpid((pid_t)(-1), NULL, WNOHANG) > 0) {}
|
||||
else {
|
||||
while ((pid = waitpid((pid_t)(-1), NULL, WNOHANG|WNOWAIT)) > 0) {
|
||||
if (pid == child_pid)
|
||||
break;
|
||||
pid = waitpid(pid, NULL, WNOHANG);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SIGTERM:
|
||||
exiting = 1;
|
||||
@ -451,6 +460,7 @@ static void supervisor(char *exec, char **argv)
|
||||
int healthcheck_respawn;
|
||||
int i;
|
||||
int nkilled;
|
||||
int ready;
|
||||
int sig_send;
|
||||
pid_t health_pid;
|
||||
pid_t wait_pid;
|
||||
@ -498,18 +508,18 @@ static void supervisor(char *exec, char **argv)
|
||||
alarm(healthcheckdelay);
|
||||
else if (healthchecktimer)
|
||||
alarm(healthchecktimer);
|
||||
fifo_fd = open(fifopath, O_RDONLY |O_NONBLOCK);
|
||||
failing = 0;
|
||||
while (!exiting) {
|
||||
healthcheck_respawn = 0;
|
||||
wait_pid = waitpid(child_pid, &i, WNOHANG);
|
||||
fifo_fd = open(fifopath, O_RDONLY);
|
||||
if (fifo_fd > 0) {
|
||||
memset(buf, 0, sizeof(buf));
|
||||
if (fifo_fd >= 0) {
|
||||
count = read(fifo_fd, buf, sizeof(buf) - 1);
|
||||
close(fifo_fd);
|
||||
if (count != -1)
|
||||
buf[count] = 0;
|
||||
}
|
||||
if (strlen(buf) > 0) {
|
||||
if (count == 0)
|
||||
continue;
|
||||
syslog(LOG_DEBUG, "Received %s from fifo", buf);
|
||||
if (strncasecmp(buf, "sig", 3) == 0) {
|
||||
if ((sscanf(buf, "%s %d", cmd, &sig_send) == 2)
|
||||
@ -521,6 +531,7 @@ static void supervisor(char *exec, char **argv)
|
||||
sig_send, child_pid);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (do_healthcheck) {
|
||||
do_healthcheck = 0;
|
||||
@ -553,6 +564,7 @@ static void supervisor(char *exec, char **argv)
|
||||
syslog(LOG_INFO, "killed %d processes", nkilled);
|
||||
continue;
|
||||
}
|
||||
wait_pid = waitpid(child_pid, &i, WNOHANG);
|
||||
if (wait_pid == child_pid) {
|
||||
if (WIFEXITED(i))
|
||||
syslog(LOG_WARNING, "%s, pid %d, exited with return code %d",
|
||||
|
Loading…
Reference in New Issue
Block a user