service: introduce Restart=on-failure and Restart=on-abort
This commit is contained in:
parent
c84ed68f30
commit
50caaedb2c
2
TODO
2
TODO
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue