]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/service.h
core: introduce new Restart=on-abnormal setting
[thirdparty/systemd.git] / src / core / service.h
CommitLineData
03467c88 1/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
5cb5a6ff 2
c2f1db8f 3#pragma once
5cb5a6ff 4
a7334b09
LP
5/***
6 This file is part of systemd.
7
8 Copyright 2010 Lennart Poettering
9
10 systemd is free software; you can redistribute it and/or modify it
5430f7f2
LP
11 under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
a7334b09
LP
13 (at your option) any later version.
14
15 systemd is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5430f7f2 18 Lesser General Public License for more details.
a7334b09 19
5430f7f2 20 You should have received a copy of the GNU Lesser General Public License
a7334b09
LP
21 along with systemd; If not, see <http://www.gnu.org/licenses/>.
22***/
23
5cb5a6ff
LP
24typedef struct Service Service;
25
87f0e418 26#include "unit.h"
9cf3ab0e 27#include "path.h"
1e2e8133 28#include "ratelimit.h"
4819ff03 29#include "kill.h"
96342de6 30#include "exit-status.h"
5cb5a6ff
LP
31
32typedef enum ServiceState {
33 SERVICE_DEAD,
34 SERVICE_START_PRE,
35 SERVICE_START,
36 SERVICE_START_POST,
37 SERVICE_RUNNING,
ba035df2 38 SERVICE_EXITED, /* Nothing is running anymore, but RemainAfterExit is true hence this is OK */
5cb5a6ff 39 SERVICE_RELOAD,
034c6ed7
LP
40 SERVICE_STOP, /* No STOP_PRE state, instead just register multiple STOP executables */
41 SERVICE_STOP_SIGTERM,
42 SERVICE_STOP_SIGKILL,
5cb5a6ff 43 SERVICE_STOP_POST,
034c6ed7
LP
44 SERVICE_FINAL_SIGTERM, /* In case the STOP_POST executable hangs, we shoot that down, too */
45 SERVICE_FINAL_SIGKILL,
fdf20a31 46 SERVICE_FAILED,
034c6ed7 47 SERVICE_AUTO_RESTART,
5cb5a6ff 48 _SERVICE_STATE_MAX,
94f04347 49 _SERVICE_STATE_INVALID = -1
5cb5a6ff
LP
50} ServiceState;
51
034c6ed7 52typedef enum ServiceRestart {
525ee6f4 53 SERVICE_RESTART_NO,
034c6ed7 54 SERVICE_RESTART_ON_SUCCESS,
50caaedb 55 SERVICE_RESTART_ON_FAILURE,
6cfe2fde 56 SERVICE_RESTART_ON_ABNORMAL,
dc99a976 57 SERVICE_RESTART_ON_WATCHDOG,
50caaedb 58 SERVICE_RESTART_ON_ABORT,
94f04347
LP
59 SERVICE_RESTART_ALWAYS,
60 _SERVICE_RESTART_MAX,
61 _SERVICE_RESTART_INVALID = -1
034c6ed7
LP
62} ServiceRestart;
63
64typedef enum ServiceType {
05e343b7 65 SERVICE_SIMPLE, /* we fork and go on right-away (i.e. modern socket activated daemons) */
1f48cf56 66 SERVICE_FORKING, /* forks by itself (i.e. traditional daemons) */
34e9ba66 67 SERVICE_ONESHOT, /* we fork and wait until the program finishes (i.e. programs like fsck which run and need to finish before we continue) */
05e343b7 68 SERVICE_DBUS, /* we fork and wait until a specific D-Bus name appears on the bus */
8c47c732 69 SERVICE_NOTIFY, /* we fork and wait until a daemon sends us a ready message with sd_notify() */
f2b68789 70 SERVICE_IDLE, /* much like simple, but delay exec() until all jobs are dispatched. */
94f04347
LP
71 _SERVICE_TYPE_MAX,
72 _SERVICE_TYPE_INVALID = -1
034c6ed7 73} ServiceType;
5cb5a6ff
LP
74
75typedef enum ServiceExecCommand {
76 SERVICE_EXEC_START_PRE,
77 SERVICE_EXEC_START,
78 SERVICE_EXEC_START_POST,
5cb5a6ff 79 SERVICE_EXEC_RELOAD,
5cb5a6ff
LP
80 SERVICE_EXEC_STOP,
81 SERVICE_EXEC_STOP_POST,
e537352b
LP
82 _SERVICE_EXEC_COMMAND_MAX,
83 _SERVICE_EXEC_COMMAND_INVALID = -1
5cb5a6ff
LP
84} ServiceExecCommand;
85
c952c6ec
LP
86typedef enum NotifyAccess {
87 NOTIFY_NONE,
88 NOTIFY_ALL,
89 NOTIFY_MAIN,
90 _NOTIFY_ACCESS_MAX,
91 _NOTIFY_ACCESS_INVALID = -1
92} NotifyAccess;
93
f42806df
LP
94typedef enum ServiceResult {
95 SERVICE_SUCCESS,
96 SERVICE_FAILURE_RESOURCES,
97 SERVICE_FAILURE_TIMEOUT,
98 SERVICE_FAILURE_EXIT_CODE,
99 SERVICE_FAILURE_SIGNAL,
100 SERVICE_FAILURE_CORE_DUMP,
bb242b7b 101 SERVICE_FAILURE_WATCHDOG,
8d1b002a 102 SERVICE_FAILURE_START_LIMIT,
f42806df
LP
103 _SERVICE_RESULT_MAX,
104 _SERVICE_RESULT_INVALID = -1
105} ServiceResult;
106
bf500566
MO
107typedef enum FailureAction {
108 SERVICE_FAILURE_ACTION_NONE,
109 SERVICE_FAILURE_ACTION_REBOOT,
110 SERVICE_FAILURE_ACTION_REBOOT_FORCE,
111 SERVICE_FAILURE_ACTION_REBOOT_IMMEDIATE,
112 _SERVICE_FAILURE_ACTION_MAX,
113 _SERVICE_FAILURE_ACTION_INVALID = -1
114} FailureAction;
4b939747 115
5cb5a6ff 116struct Service {
ac155bb8 117 Unit meta;
5cb5a6ff 118
034c6ed7
LP
119 ServiceType type;
120 ServiceRestart restart;
96342de6
LN
121 ExitStatusSet restart_ignore_status;
122 ExitStatusSet success_status;
034c6ed7
LP
123
124 /* If set we'll read the main daemon PID from this file */
125 char *pid_file;
126
127 usec_t restart_usec;
d568a335
MS
128 usec_t timeout_start_usec;
129 usec_t timeout_stop_usec;
5cb5a6ff 130
a6927d7f 131 dual_timestamp watchdog_timestamp;
bb242b7b 132 usec_t watchdog_usec;
718db961 133 sd_event_source *watchdog_event_source;
a6927d7f 134
e537352b 135 ExecCommand* exec_command[_SERVICE_EXEC_COMMAND_MAX];
4819ff03 136
5cb5a6ff 137 ExecContext exec_context;
4819ff03 138 KillContext kill_context;
4ad49000 139 CGroupContext cgroup_context;
5cb5a6ff 140
a16e1123 141 ServiceState state, deserialized_state;
034c6ed7 142
867b3b7d 143 /* The exit status of the real main process */
034c6ed7
LP
144 ExecStatus main_exec_status;
145
867b3b7d 146 /* The currently executed control process */
034c6ed7 147 ExecCommand *control_command;
867b3b7d
LP
148
149 /* The currently executed main process, which may be NULL if
150 * the main process got started via forking mode and not by
151 * us */
152 ExecCommand *main_command;
153
154 /* The ID of the control command currently being executed */
a16e1123 155 ServiceExecCommand control_command_id;
867b3b7d 156
613b411c
LP
157 /* Runtime data of the execution context */
158 ExecRuntime *exec_runtime;
159
034c6ed7 160 pid_t main_pid, control_pid;
07459bb6 161 int socket_fd;
8fe914ec
LP
162
163 bool permissions_start_only;
164 bool root_directory_start_only;
02ee865a 165 bool remain_after_exit;
3185a36b 166 bool guess_main_pid;
8fe914ec 167
05e343b7 168 /* If we shut down, remember why */
f42806df
LP
169 ServiceResult result;
170 ServiceResult reload_result;
e2f3b44c 171
5de6b302 172 bool main_pid_known:1;
6dfa5494 173 bool main_pid_alien:1;
05e343b7 174 bool bus_name_good:1;
47342320 175 bool forbid_restart:1;
d568a335 176 bool start_timeout_defined:1;
07459bb6 177#ifdef HAVE_SYSV_COMPAT
1b64d026 178 bool is_sysv:1;
e537352b 179 bool sysv_has_lsb:1;
5de6b302 180 bool sysv_enabled:1;
ea87ca5a 181 int sysv_start_priority_from_rcnd;
2c4104f0 182 int sysv_start_priority;
8fe914ec 183
8309400a 184 char *sysv_runlevels;
07459bb6 185#endif
2c4104f0 186
05e343b7
LP
187 char *bus_name;
188
8c47c732
LP
189 char *status_text;
190
bf500566 191 FailureAction failure_action;
93ae25e6 192
4b939747 193 RateLimit start_limit;
bf500566 194 FailureAction start_limit_action;
efe6e7d3 195 char *reboot_arg;
4b939747 196
57020a3a 197 UnitRef accept_socket;
4f2d528d 198
718db961 199 sd_event_source *timer_event_source;
3a111838 200 PathSpec *pid_file_pathspec;
8fe914ec
LP
201
202 NotifyAccess notify_access;
5cb5a6ff
LP
203};
204
47be870b 205extern const UnitVTable service_vtable;
5cb5a6ff 206
57020a3a
LP
207struct Socket;
208
6cf6bbc2 209int service_set_socket_fd(Service *s, int fd, struct Socket *socket);
4f2d528d 210
44a6b1b6
ZJS
211const char* service_state_to_string(ServiceState i) _const_;
212ServiceState service_state_from_string(const char *s) _pure_;
94f04347 213
44a6b1b6
ZJS
214const char* service_restart_to_string(ServiceRestart i) _const_;
215ServiceRestart service_restart_from_string(const char *s) _pure_;
94f04347 216
44a6b1b6
ZJS
217const char* service_type_to_string(ServiceType i) _const_;
218ServiceType service_type_from_string(const char *s) _pure_;
94f04347 219
44a6b1b6
ZJS
220const char* service_exec_command_to_string(ServiceExecCommand i) _const_;
221ServiceExecCommand service_exec_command_from_string(const char *s) _pure_;
94f04347 222
44a6b1b6
ZJS
223const char* notify_access_to_string(NotifyAccess i) _const_;
224NotifyAccess notify_access_from_string(const char *s) _pure_;
c952c6ec 225
44a6b1b6
ZJS
226const char* service_result_to_string(ServiceResult i) _const_;
227ServiceResult service_result_from_string(const char *s) _pure_;
f42806df 228
bf500566
MO
229const char* failure_action_to_string(FailureAction i) _const_;
230FailureAction failure_action_from_string(const char *s) _pure_;