diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-01-29 20:12:18 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-01-29 20:12:18 +0100 |
commit | bc6aed7b8b17901ef46c3af9513ae63372b7b413 (patch) | |
tree | 7d85d2142b5e442606c36d93378d3127e8f4d009 /src/core/unit.c | |
parent | 6294b8a92db8579210d4fc9ce74097a15005b3e6 (diff) |
core: in containers, don't wait for cgroup empty notifications which will never come
Diffstat (limited to 'src/core/unit.c')
-rw-r--r-- | src/core/unit.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/core/unit.c b/src/core/unit.c index 6427f9137a..78d7b534b2 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -50,6 +50,7 @@ #include "bus-errors.h" #include "dbus.h" #include "execute.h" +#include "virt.h" const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = { [UNIT_SERVICE] = &service_vtable, @@ -2921,7 +2922,7 @@ int unit_kill_context( pid_t control_pid, bool main_pid_alien) { - int sig, wait_for_exit = 0, r; + int sig, wait_for_exit = false, r; assert(u); assert(c); @@ -2940,7 +2941,8 @@ int unit_kill_context( log_warning_unit(u->id, "Failed to kill main process " PID_FMT " (%s): %s", main_pid, strna(comm), strerror(-r)); } else { - wait_for_exit = !main_pid_alien; + if (!main_pid_alien) + wait_for_exit = true; if (c->send_sighup) kill(main_pid, SIGHUP); @@ -2976,7 +2978,16 @@ int unit_kill_context( if (r != -EAGAIN && r != -ESRCH && r != -ENOENT) log_warning_unit(u->id, "Failed to kill control group: %s", strerror(-r)); } else if (r > 0) { - wait_for_exit = true; + + /* FIXME: Now, this is a terrible hack: in + * containers cgroup empty notifications don't + * work. Hence we'll not wait for them to run + * empty for now, since there is no way to + * detect when a service ends with no main PID + * known... */ + + if (detect_container(NULL) <= 0) + wait_for_exit = true; if (c->send_sighup) { set_free(pid_set); |