| From 60532427251167b8cb2a733e19eb25ecac5c1632 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> |
| Date: Mon, 30 Jan 2017 13:06:10 -0500 |
| Subject: [PATCH] systemctl: ignore SIGTERM after switch root |
| |
| https://bugzilla.redhat.com/show_bug.cgi?id=1414904#c14 and #c15. |
| (cherry picked from commit 8a7a9ceab204fb02fd5d93a765b36b31efeb9beb) |
| --- |
| src/systemctl/systemctl.c | 13 ++++++++++++- |
| 1 file changed, 12 insertions(+), 1 deletion(-) |
| |
| diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c |
| index 4f528f6079..d68c06d9d4 100644 |
| --- a/src/systemctl/systemctl.c |
| +++ b/src/systemctl/systemctl.c |
| @@ -5595,6 +5595,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( |
| @@ -5606,8 +5614,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; |
| } |