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/systemd.special.xml | 45 +++++++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 24 deletions(-) (limited to 'man/systemd.special.xml') 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