| From 409612865dd716752da4785b5d8cb75a24cebab4 Mon Sep 17 00:00:00 2001 |
| From: Franck Bui <fbui@suse.com> |
| Date: Wed, 23 Nov 2016 16:31:24 +0100 |
| Subject: [PATCH] core: consider SIGTERM as a clean exit status for |
| initrd-switch-root.service (#4713) |
| |
| Since commit 1f0958f640b8717, systemd considers SIGTERM for short-running |
| services (aka Type=oneshot) as a failure. |
| |
| This can be an issue with initrd-switch-root.service as the command run by this |
| service (in order to switch to the new rootfs) may still be running when |
| systemd does the switch. |
| |
| However PID1 sends SIGTERM to all remaining processes right before |
| switching and initrd-switch-root.service can be one of those. |
| |
| After systemd is reexecuted and its previous state is deserialized, systemd |
| notices that initrd-switch-root.service was killed with SIGTERM and considers |
| this as a failure which leads to the emergency shell. |
| |
| To prevent this, this patch teaches systemd to consider a SIGTERM exit as a |
| clean one for this service. |
| |
| It also removes "KillMode=none" since this is pretty useless as the service is |
| never stopped by systemd but it either exits normally or it's killed by a |
| SIGTERM as described previously. |
| (cherry picked from commit a4021390fef27f4136497328f2e35e79bc88855d) |
| --- |
| units/initrd-switch-root.service.in | 8 +++++++- |
| 1 file changed, 7 insertions(+), 1 deletion(-) |
| |
| diff --git a/units/initrd-switch-root.service.in b/units/initrd-switch-root.service.in |
| index 82893dafb1..b89f2348c7 100644 |
| --- a/units/initrd-switch-root.service.in |
| +++ b/units/initrd-switch-root.service.in |
| @@ -17,4 +17,10 @@ AllowIsolate=yes |
| Type=oneshot |
| # we have to use "--force" here, otherwise systemd would umount /run |
| ExecStart=@rootbindir@/systemctl --no-block --force switch-root /sysroot |
| -KillMode=none |
| + |
| +# Just before switching to the new rootfs, systemd might send us a TERM signal |
| +# depending on how fast we are to execute the main command and exit. If we get |
| +# the SIGTERM signal that simply means that we succeed but haven't got enough |
| +# time to exit properly. Since systemd considers SIGTERM as a failure for |
| +# short-running process (aka Type=oneshot), instruct it to ignore this case. |
| +SuccessExitStatus=SIGTERM |