]> granicus.if.org Git - pdns/commitdiff
Add signal handling for SIGTERM and SIGINT in pdns_recursor
authorFrank Louwers <frank@louwers.be>
Wed, 25 Sep 2019 10:07:14 +0000 (12:07 +0200)
committerFrank Louwers <frank@louwers.be>
Wed, 25 Sep 2019 12:02:11 +0000 (14:02 +0200)
The Linux kernel handles signals for PID 1 processes differently. It
doesn't implement a default handler for some signals such as
SIGTERM/SIGINT.

When running pdns_recursor as a container, this causes a few annoyances.
You can work around those by running your containers with --init or by
installing `tini` inside the container. Or you can handle the signals in
the application itself.

This commit adds signal() handlers for SIGTERM and SIGINT for
pdns_recursor.

pdns/pdns_recursor.cc
pdns/rec_channel.hh
pdns/rec_channel_rec.cc

index 75f2bdf648cfc5d87a91fe8963dc2364c26d3145..5a462be4ba87745c3765ee06e722cfacaa032c77 100644 (file)
@@ -2786,6 +2786,11 @@ static void daemonize(void)
   }
 }
 
+static void termIntHandler(int)
+{
+  doExitNicely();
+}
+
 static void usr1Handler(int)
 {
   statsWanted=true;
@@ -4075,6 +4080,8 @@ static int serviceMain(int argc, char*argv[])
     g_log.toConsole(Logger::Critical);
     daemonize();
   }
+  signal(SIGTERM,termIntHandler);
+  signal(SIGINT,termIntHandler);
   signal(SIGUSR1,usr1Handler);
   signal(SIGUSR2,usr2Handler);
   signal(SIGPIPE,SIG_IGN);
index 041c2ca2aa27dde102f537beb9568ce3388e727f..ee653752ba610a4eae99d81d549e60264a5f029a 100644 (file)
@@ -89,3 +89,6 @@ void blacklistStats(StatComponent component, const string& stats);
 
 void registerAllStats();
 
+void doExitGeneric(bool nicely);
+void doExit();
+void doExitNicely();
index 432b8a22e7c87c5d3487237edc01db2e9150d6ad..1a1cdcd5b981357cbf414be04575e9554f9f403c 100644 (file)
@@ -1161,7 +1161,7 @@ void registerAllStats()
   }
 }
 
-static void doExitGeneric(bool nicely)
+void doExitGeneric(bool nicely)
 {
   g_log<<Logger::Error<<"Exiting on user request"<<endl;
   extern RecursorControlChannel s_rcc;
@@ -1176,12 +1176,12 @@ static void doExitGeneric(bool nicely)
     _exit(1);
 }
 
-static void doExit()
+void doExit()
 {
   doExitGeneric(false);
 }
 
-static void doExitNicely()
+void doExitNicely()
 {
   doExitGeneric(true);
 }