Set a TERM handler to terminate properly if running as PID 1
authorHeiko Schlittermann (HS12-RIPE) <hs@schlittermann.de>
Thu, 22 Mar 2018 22:32:53 +0000 (23:32 +0100)
committerHeiko Schlittermann (HS12-RIPE) <hs@schlittermann.de>
Thu, 22 Mar 2018 22:40:12 +0000 (23:40 +0100)
doc/doc-txt/ChangeLog
src/src/exim.c

index 236ccae8b54ad6abbb1d698f6d783c35f0084f96..459ffe11a2e38b39119f60662909ae6050310467 100644 (file)
@@ -165,6 +165,9 @@ JH/30 The (EXPERIMENTAL_DMARC) variable $dmarc_ar_header is withdrawn, being
 
 JH/31 Bug 2257: Fix pipe transport to not use a socket-only syscall.
 
+HS/03 Set a handler for SIGTERM and call exit(3) if running as PID 1. This
+      allows proper process termination in container environments.
+
 
 Exim version 4.90
 -----------------
index 4d35b51f3053bb75f0ac3a085644a88a0ddf0f54..d740814f9eab856080b3cfa9adce9e4c4d6ba1cd 100644 (file)
@@ -187,7 +187,15 @@ DEBUG(D_process_info) debug_printf("set_process_info: %s", process_info);
 va_end(ap);
 }
 
+/***********************************************
+*            Handler for SIGTERM               *
+***********************************************/
 
+static void
+term_handler(int sig)
+{
+  exit(1);
+}
 
 
 /*************************************************
@@ -1678,6 +1686,10 @@ descriptive text. */
 set_process_info("initializing");
 os_restarting_signal(SIGUSR1, usr1_handler);
 
+/* If running in a dockerized environment, the TERM signal is only
+delegated to the PID 1 if we request it by setting an signal handler */
+if (getpid() == 1) signal(SIGTERM, term_handler);
+
 /* SIGHUP is used to get the daemon to reconfigure. It gets set as appropriate
 in the daemon code. For the rest of Exim's uses, we ignore it. */