containers: systemd exits with non-zero code

System Internals / systemd - Alban Crequy [gmail.com] - 21 September 2015 10:32 UTC

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

287419c containers: systemd exits with non-zero code
Makefile.am | 3 +++
man/systemctl.xml | 10 ++++++---
man/systemd.special.xml | 45 +++++++++++++++++++----------------------
src/core/dbus-manager.c | 32 +++++++++++++++++++++++++++--
src/core/main.c | 21 ++++++++++++-------
src/core/manager.h | 5 +++++
src/core/shutdown.c | 22 ++++++++++++++++++++
src/systemctl/systemctl.c | 30 +++++++++++++++++++++++++--
units/.gitignore | 1 +
units/exit.target | 17 ++++++++++++++++
units/systemd-exit.service.in | 17 ++++++++++++++++
11 files changed, 165 insertions(+), 38 deletions(-)

Upstream: github.com


  • Share