When SIGTERM or SIGINT is received, terminate worker processes.
MFC after: 2 weeks Obtained from: Wheel Systems Sp. z o.o. http://www.wheelsystems.com
This commit is contained in:
parent
4767ee29f1
commit
5da2320932
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=211899
@ -82,6 +82,10 @@ sighandler(int sig)
|
|||||||
{
|
{
|
||||||
|
|
||||||
switch (sig) {
|
switch (sig) {
|
||||||
|
case SIGINT:
|
||||||
|
case SIGTERM:
|
||||||
|
sigexit_received = true;
|
||||||
|
break;
|
||||||
case SIGCHLD:
|
case SIGCHLD:
|
||||||
sigchld_received = true;
|
sigchld_received = true;
|
||||||
break;
|
break;
|
||||||
@ -373,6 +377,25 @@ hastd_reload(void)
|
|||||||
pjdlog_warning("Configuration not reloaded.");
|
pjdlog_warning("Configuration not reloaded.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
terminate_workers(void)
|
||||||
|
{
|
||||||
|
struct hast_resource *res;
|
||||||
|
|
||||||
|
pjdlog_info("Termination signal received, exiting.");
|
||||||
|
TAILQ_FOREACH(res, &cfg->hc_resources, hr_next) {
|
||||||
|
if (res->hr_workerpid == 0)
|
||||||
|
continue;
|
||||||
|
pjdlog_info("Terminating worker process (resource=%s, role=%s, pid=%u).",
|
||||||
|
res->hr_name, role2str(res->hr_role), res->hr_workerpid);
|
||||||
|
if (kill(res->hr_workerpid, SIGTERM) == 0)
|
||||||
|
continue;
|
||||||
|
pjdlog_errno(LOG_WARNING,
|
||||||
|
"Unable to send signal to worker process (resource=%s, role=%s, pid=%u).",
|
||||||
|
res->hr_name, role2str(res->hr_role), res->hr_workerpid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
listen_accept(void)
|
listen_accept(void)
|
||||||
{
|
{
|
||||||
@ -599,6 +622,11 @@ main_loop(void)
|
|||||||
int cfd, lfd, maxfd, ret;
|
int cfd, lfd, maxfd, ret;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
if (sigexit_received) {
|
||||||
|
sigexit_received = false;
|
||||||
|
terminate_workers();
|
||||||
|
exit(EX_OK);
|
||||||
|
}
|
||||||
if (sigchld_received) {
|
if (sigchld_received) {
|
||||||
sigchld_received = false;
|
sigchld_received = false;
|
||||||
child_exit();
|
child_exit();
|
||||||
@ -692,6 +720,8 @@ main(int argc, char *argv[])
|
|||||||
cfg = yy_config_parse(cfgpath, true);
|
cfg = yy_config_parse(cfgpath, true);
|
||||||
assert(cfg != NULL);
|
assert(cfg != NULL);
|
||||||
|
|
||||||
|
signal(SIGINT, sighandler);
|
||||||
|
signal(SIGTERM, sighandler);
|
||||||
signal(SIGHUP, sighandler);
|
signal(SIGHUP, sighandler);
|
||||||
signal(SIGCHLD, sighandler);
|
signal(SIGCHLD, sighandler);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user