containers: systemd exits with non-zero code
authorAlban Crequy <alban.crequy@gmail.com>
Fri, 18 Sep 2015 11:37:34 +0000 (13:37 +0200)
committerAlban Crequy <alban.crequy@gmail.com>
Mon, 21 Sep 2015 15:32:45 +0000 (17:32 +0200)
commit287419c119ef961db487a281162ab037eba70c61
treee7f4c01e50b7b944b9d9d0ed8290ead8762da906
parenta1b7a5bbdd8da94e41b5e79be7a6e853ae910d2b
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
Makefile.am
man/systemctl.xml
man/systemd.special.xml
src/core/dbus-manager.c
src/core/main.c
src/core/manager.h
src/core/shutdown.c
src/systemctl/systemctl.c
units/.gitignore
units/exit.target [new file with mode: 0644]
units/systemd-exit.service.in [new file with mode: 0644]