From 287419c119ef961db487a281162ab037eba70c61 Mon Sep 17 00:00:00 2001 From: Alban Crequy Date: Fri, 18 Sep 2015 13:37:34 +0200 Subject: containers: systemd exits with non-zero code When a systemd service running in a container exits with a non-zero code, it can be useful to terminate the container immediately and get the exit code back to the host, when systemd-nspawn returns. This was not possible to do. This patch adds the following to make it possible: - Add a read-only "ExitCode" property on PID 1's "Manager" bus object. By default, it is 0 so the behaviour stays the same as previously. - Add a method "SetExitCode" on the same object. The method fails when called on baremetal: it is only allowed in containers or in user session. - Add support in systemctl to call "systemctl exit 42". It reuses the existing code for user session. - Add exit.target and systemd-exit.service to the system instance. - Change main() to actually call systemd-shutdown to exit() with the correct value. - Add verb 'exit' in systemd-shutdown with parameter --exit-code - Update systemctl manpage. I used the following to test it: | $ sudo rkt --debug --insecure-skip-verify run \ | --mds-register=false --local docker://busybox \ | --exec=/bin/chroot -- /proc/1/root \ | systemctl --force exit 42 | ... | Container rkt-895a0cba-5c66-4fa5-831c-e3f8ddc5810d failed with error code 42. | $ echo $? | 42 Fixes https://github.com/systemd/systemd/issues/1290 --- man/systemctl.xml | 10 +++++++--- man/systemd.special.xml | 45 +++++++++++++++++++++------------------------ 2 files changed, 28 insertions(+), 27 deletions(-) (limited to 'man') diff --git a/man/systemctl.xml b/man/systemctl.xml index d8d433e4d3..c1359d1678 100644 --- a/man/systemctl.xml +++ b/man/systemctl.xml @@ -1633,13 +1633,17 @@ kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service - exit + exit EXIT_CODE Ask the systemd manager to quit. This is only supported for user service managers (i.e. in conjunction - with the option) and will fail - otherwise. + with the option) or in containers + and is equivalent to poweroff otherwise. + + The systemd manager can exit with a non-zero exit + code if the optional argument + EXIT_CODE is given. diff --git a/man/systemd.special.xml b/man/systemd.special.xml index e4700d950b..6e0dff9b47 100644 --- a/man/systemd.special.xml +++ b/man/systemd.special.xml @@ -211,6 +211,26 @@ + + exit.target + + A special service unit for shutting down the system or + user service manager. It also works in containers and is + equivalent to poweroff.target on + non-container systems. + + Applications wanting to terminate the user service + manager should start this unit. If systemd receives + SIGTERM or SIGINT + when running as user service daemon, it will start this + unit. + + Normally, this pulls in + shutdown.target which in turn should be + conflicted by all units that want to be shut down on user + service manager exit. + + final.target @@ -797,6 +817,7 @@ When systemd runs as a user instance, the following special units are available, which have similar definitions as their system counterparts: + exit.target, default.target, shutdown.target, sockets.target, @@ -806,30 +827,6 @@ printer.target, smartcard.target, sound.target. - - In addition, the following special unit is understood only - when systemd runs as service instance: - - - - exit.target - - A special service unit for shutting down the user - service manager. - - Applications wanting to terminate the user service - manager should start this unit. If systemd receives - SIGTERM or SIGINT - when running as user service daemon, it will start this - unit. - - Normally, this pulls in - shutdown.target which in turn should be - conflicted by all units that want to be shut down on user - service manager exit. - - - -- cgit v1.2.3-54-g00ecf