From ee7c0cb8d94710f5e40967e16d17071c89253a6d Mon Sep 17 00:00:00 2001 From: Vadim Yanitskiy Date: Tue, 19 Mar 2019 18:10:51 +0700 Subject: [PATCH] hlr.c: properly terminate the process on SIGTERM As per the systemd.kill manual, when a service is going to be stopped by systemd, the process will first be terminated via SIGTERM. If then, after a delay, processes still remain, the the termination request is repeated with the SIGKILL. It was observed that osmo-hlr immediately terminates on SIGTERM, leaving the SQLite database open. As a result, several temporary files (such as hlr.db-shm, hlr.db-wal) remain, allowing the further recovery: DDB ERROR <0001> db.c:86 (283) recovered 10 frames from WAL file Let's properly handle SIGTERM in the same way as we handle SIGINT. Change-Id: I1a4a48b95bbaed74ff5a03fb5797a44bdb1fcd3a --- src/hlr.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/hlr.c b/src/hlr.c index f374ccc9..422a56dc 100644 --- a/src/hlr.c +++ b/src/hlr.c @@ -612,8 +612,9 @@ static void handle_options(int argc, char **argv) static void signal_hdlr(int signal) { switch (signal) { + case SIGTERM: case SIGINT: - LOGP(DMAIN, LOGL_NOTICE, "Terminating due to SIGINT\n"); + LOGP(DMAIN, LOGL_NOTICE, "Terminating due to signal=%d\n", signal); quit++; break; case SIGUSR1: @@ -709,6 +710,7 @@ int main(int argc, char **argv) osmo_init_ignore_signals(); signal(SIGINT, &signal_hdlr); + signal(SIGTERM, &signal_hdlr); signal(SIGUSR1, &signal_hdlr); if (cmdline_opts.daemonize) {