systemctl: ignore SIGTERM after switch root
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Mon, 30 Jan 2017 18:06:10 +0000 (13:06 -0500)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 31 Jan 2017 06:34:40 +0000 (01:34 -0500)
https://bugzilla.redhat.com/show_bug.cgi?id=1414904#c14 and #c15.

src/systemctl/systemctl.c

index 6eed921..a20ca1b 100644 (file)
@@ -5663,6 +5663,14 @@ static int switch_root(int argc, char *argv[], void *userdata) {
         if (r < 0)
                 return r;
 
+        /* If we are slow to exit after the root switch, the new systemd instance
+         * will send us a signal to terminate. Just ignore it and exit normally.
+         * This way the unit does not end up as failed.
+         */
+        r = ignore_signals(SIGTERM, -1);
+        if (r < 0)
+                log_warning_errno(r, "Failed to change disposition of SIGTERM to ignore: %m");
+
         log_debug("Switching root - root: %s; init: %s", root, strna(init));
 
         r = sd_bus_call_method(
@@ -5674,8 +5682,11 @@ static int switch_root(int argc, char *argv[], void *userdata) {
                         &error,
                         NULL,
                         "ss", root, init);
-        if (r < 0)
+        if (r < 0) {
+                (void) default_signals(SIGTERM, -1);
+
                 return log_error_errno(r, "Failed to switch root: %s", bus_error_message(&error, r));
+        }
 
         return 0;
 }