diff --git a/child.c b/child.c index 7abef4e..039a1af 100644 --- a/child.c +++ b/child.c @@ -85,6 +85,8 @@ volatile sig_atomic_t exit_request = 0; static int idle; /* non 0 means this child is in idle state */ static int accepted = 0; +static int child_inet_fd = 0; + extern int myargc; extern char **myargv; @@ -134,6 +136,10 @@ void do_child(int unix_fd, int inet_fd) pool_set_nonblock(inet_fd); } #endif + if (inet_fd) + { + child_inet_fd = inet_fd; + } /* Initialize my backend status */ pool_initialize_private_backend_status(); @@ -1252,6 +1258,8 @@ static RETSIGTYPE die(int sig) switch (sig) { case SIGTERM: /* smart shutdown */ + /* Refuse further requests by closing listen socket */ + if (child_inet_fd) close(child_inet_fd); if (idle == 0) { pool_debug("child receives smart shutdown request but it's not in idle state"); diff --git a/main.c b/main.c index 5c35a77..7c71724 100644 --- a/main.c +++ b/main.c @@ -1628,6 +1628,8 @@ static RETSIGTYPE exit_handler(int sig) exiting = 1; + close(inet_fd); + for (i = 0; i < pool_config->num_init_children; i++) { pid_t pid = process_info[i].pid;