diff options
author | pjd <pjd@FreeBSD.org> | 2010-08-27 21:28:02 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2010-08-27 21:28:02 +0000 |
commit | 98dd369bddf1a21aa7d27bfe4ae71a30f6024c5d (patch) | |
tree | 3d4fd4b743d9cf6beac22a9cd24ea5e4c4983aa6 /sbin | |
parent | db793cba897d56bf2e3b8c7fbffce86c11cf2c50 (diff) | |
download | FreeBSD-src-98dd369bddf1a21aa7d27bfe4ae71a30f6024c5d.zip FreeBSD-src-98dd369bddf1a21aa7d27bfe4ae71a30f6024c5d.tar.gz |
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
Diffstat (limited to 'sbin')
-rw-r--r-- | sbin/hastd/hastd.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/sbin/hastd/hastd.c b/sbin/hastd/hastd.c index c5eebf4..785798a 100644 --- a/sbin/hastd/hastd.c +++ b/sbin/hastd/hastd.c @@ -82,6 +82,10 @@ sighandler(int sig) { switch (sig) { + case SIGINT: + case SIGTERM: + sigexit_received = true; + break; case SIGCHLD: sigchld_received = true; break; @@ -374,6 +378,25 @@ failed: } 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 listen_accept(void) { struct hast_resource *res; @@ -599,6 +622,11 @@ main_loop(void) int cfd, lfd, maxfd, ret; for (;;) { + if (sigexit_received) { + sigexit_received = false; + terminate_workers(); + exit(EX_OK); + } if (sigchld_received) { sigchld_received = false; child_exit(); @@ -692,6 +720,8 @@ main(int argc, char *argv[]) cfg = yy_config_parse(cfgpath, true); assert(cfg != NULL); + signal(SIGINT, sighandler); + signal(SIGTERM, sighandler); signal(SIGHUP, sighandler); signal(SIGCHLD, sighandler); |