service: introduce Restart=on-failure and Restart=on-abort

This commit is contained in:
Lennart Poettering 2010-10-08 18:34:54 +02:00
parent c84ed68f30
commit 50caaedb2c
4 changed files with 31 additions and 16 deletions

2
TODO
View File

@ -84,8 +84,6 @@
* enable syslog.socket by default, activating our kmsg bridge * enable syslog.socket by default, activating our kmsg bridge
* Restart=on-failure and Restart=on-abort
* when processes remain in a service even though the start command failed enter active * when processes remain in a service even though the start command failed enter active
* fix plymouth socket, when plymouth started to use a clean one * fix plymouth socket, when plymouth started to use a clean one

View File

@ -426,19 +426,28 @@
<varlistentry> <varlistentry>
<term><varname>Restart=</varname></term> <term><varname>Restart=</varname></term>
<listitem><para>Configures whether the <listitem><para>Configures whether the
main service process shall be restarted when main service process shall be
it exists. Takes one of restarted when it exists. Takes one of
<option>no</option>, <option>no</option>,
<option>on-success</option> or <option>on-success</option>,
<option>always</option>. If <option>on-failure</option>,
set to <option>no</option> (the <option>on-abort</option> or
default) the service will not be <option>always</option>. If set to
restarted when it exits. If set to <option>no</option> (the default) the
<option>on-success</option> it service will not be restarted when it
will be restarted only when it exited exits. If set to
cleanly, i.e. terminated with an exit <option>on-success</option> it will be
code of 0. If set to restarted only when it exited cleanly,
<option>always</option> the i.e. terminated with an exit code of
0. If set to
<option>on-failure</option> it will be
restared only when it exited with an
exit code not equalling 0, or when
terminated by a signal. If set to
<option>on-abort</option> it will be
restarted only if it exits due to
reception of an uncaught signal. If
set to <option>always</option> the
service will be restarted regardless service will be restarted regardless
whether it exited cleanly or not, or whether it exited cleanly or not, or
got terminated abnormally by a got terminated abnormally by a

View File

@ -1627,7 +1627,11 @@ static void service_enter_dead(Service *s, bool success, bool allow_restart) {
if (allow_restart && if (allow_restart &&
!s->forbid_restart && !s->forbid_restart &&
(s->restart == SERVICE_RESTART_ALWAYS || (s->restart == SERVICE_RESTART_ALWAYS ||
(s->restart == SERVICE_RESTART_ON_SUCCESS && !s->failure))) { (s->restart == SERVICE_RESTART_ON_SUCCESS && !s->failure) ||
(s->restart == SERVICE_RESTART_ON_FAILURE && s->failure) ||
(s->restart == SERVICE_RESTART_ON_ABORT && s->failure &&
(s->main_exec_status.code == CLD_KILLED ||
s->main_exec_status.code == CLD_DUMPED)))) {
if ((r = unit_watch_timer(UNIT(s), s->restart_usec, &s->timer_watch)) < 0) if ((r = unit_watch_timer(UNIT(s), s->restart_usec, &s->timer_watch)) < 0)
goto fail; goto fail;
@ -3115,7 +3119,9 @@ DEFINE_STRING_TABLE_LOOKUP(service_state, ServiceState);
static const char* const service_restart_table[_SERVICE_RESTART_MAX] = { static const char* const service_restart_table[_SERVICE_RESTART_MAX] = {
[SERVICE_RESTART_NO] = "no", [SERVICE_RESTART_NO] = "no",
[SERVICE_RESTART_ON_SUCCESS] = "on-success", [SERVICE_RESTART_ON_SUCCESS] = "on-success",
[SERVICE_RESTART_ALWAYS] = "always", [SERVICE_RESTART_ON_FAILURE] = "on-failure",
[SERVICE_RESTART_ON_ABORT] = "on-abort",
[SERVICE_RESTART_ALWAYS] = "always"
}; };
DEFINE_STRING_TABLE_LOOKUP(service_restart, ServiceRestart); DEFINE_STRING_TABLE_LOOKUP(service_restart, ServiceRestart);

View File

@ -50,6 +50,8 @@ typedef enum ServiceState {
typedef enum ServiceRestart { typedef enum ServiceRestart {
SERVICE_RESTART_NO, SERVICE_RESTART_NO,
SERVICE_RESTART_ON_SUCCESS, SERVICE_RESTART_ON_SUCCESS,
SERVICE_RESTART_ON_FAILURE,
SERVICE_RESTART_ON_ABORT,
SERVICE_RESTART_ALWAYS, SERVICE_RESTART_ALWAYS,
_SERVICE_RESTART_MAX, _SERVICE_RESTART_MAX,
_SERVICE_RESTART_INVALID = -1 _SERVICE_RESTART_INVALID = -1