diff options
author | Michael Olbrich <m.olbrich@pengutronix.de> | 2013-05-19 12:10:55 +0200 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2013-05-21 09:23:51 -0400 |
commit | 9e9c3abcfa6b93500960531d0d7aa64b8b2b0349 (patch) | |
tree | 7add36bbec109b5cc21e7f028596dda457410e59 /src | |
parent | 571bfc6c56962dfc926e9bbc1600c511fc8565d1 (diff) |
service: kill processes with SIGKILL on watchdog failure
Just calling service_enter_dead() does not kill any processes.
As a result, the old process may still be running when the new one is
started.
After a watchdog failure the service is in an undefined state.
Using the normal shutdown mechanism makes no sense. Instead all processes
are just killed and the service can try to restart.
Diffstat (limited to 'src')
-rw-r--r-- | src/core/service.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/src/core/service.c b/src/core/service.c index 3617c24711..e110a41dae 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -235,7 +235,7 @@ static void service_stop_watchdog(Service *s) { s->watchdog_timestamp.monotonic = 0; } -static void service_enter_dead(Service *s, ServiceResult f, bool allow_restart); +static void service_enter_signal(Service *s, ServiceState state, ServiceResult f); static void service_handle_watchdog(Service *s) { usec_t offset; @@ -249,7 +249,7 @@ static void service_handle_watchdog(Service *s) { offset = now(CLOCK_MONOTONIC) - s->watchdog_timestamp.monotonic; if (offset >= s->watchdog_usec) { log_error_unit(UNIT(s)->id, "%s watchdog timeout!", UNIT(s)->id); - service_enter_dead(s, SERVICE_FAILURE_WATCHDOG, true); + service_enter_signal(s, SERVICE_FINAL_SIGKILL, SERVICE_FAILURE_WATCHDOG); return; } @@ -1939,8 +1939,6 @@ fail: service_enter_dead(s, SERVICE_FAILURE_RESOURCES, false); } -static void service_enter_signal(Service *s, ServiceState state, ServiceResult f); - static void service_enter_stop_post(Service *s, ServiceResult f) { int r; assert(s); |