]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/core/service.h
core: expose consumed CPU time per unit
[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 24typedef struct Service Service;
a354329f 25typedef struct ServiceFDStore ServiceFDStore;
5cb5a6ff 26
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 40 SERVICE_STOP, /* No STOP_PRE state, instead just register multiple STOP executables */
db2cb23b 41 SERVICE_STOP_SIGABRT, /* Watchdog timeout */
034c6ed7
LP
42 SERVICE_STOP_SIGTERM,
43 SERVICE_STOP_SIGKILL,
5cb5a6ff 44 SERVICE_STOP_POST,
034c6ed7
LP
45 SERVICE_FINAL_SIGTERM, /* In case the STOP_POST executable hangs, we shoot that down, too */
46 SERVICE_FINAL_SIGKILL,
fdf20a31 47 SERVICE_FAILED,
034c6ed7 48 SERVICE_AUTO_RESTART,
5cb5a6ff 49 _SERVICE_STATE_MAX,
94f04347 50 _SERVICE_STATE_INVALID = -1
5cb5a6ff
LP
51} ServiceState;
52
034c6ed7 53typedef enum ServiceRestart {
525ee6f4 54 SERVICE_RESTART_NO,
034c6ed7 55 SERVICE_RESTART_ON_SUCCESS,
50caaedb 56 SERVICE_RESTART_ON_FAILURE,
6cfe2fde 57 SERVICE_RESTART_ON_ABNORMAL,
dc99a976 58 SERVICE_RESTART_ON_WATCHDOG,
50caaedb 59 SERVICE_RESTART_ON_ABORT,
94f04347
LP
60 SERVICE_RESTART_ALWAYS,
61 _SERVICE_RESTART_MAX,
62 _SERVICE_RESTART_INVALID = -1
034c6ed7
LP
63} ServiceRestart;
64
65typedef enum ServiceType {
05e343b7 66 SERVICE_SIMPLE, /* we fork and go on right-away (i.e. modern socket activated daemons) */
1f48cf56 67 SERVICE_FORKING, /* forks by itself (i.e. traditional daemons) */
34e9ba66 68 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 69 SERVICE_DBUS, /* we fork and wait until a specific D-Bus name appears on the bus */
8c47c732 70 SERVICE_NOTIFY, /* we fork and wait until a daemon sends us a ready message with sd_notify() */
f2b68789 71 SERVICE_IDLE, /* much like simple, but delay exec() until all jobs are dispatched. */
94f04347
LP
72 _SERVICE_TYPE_MAX,
73 _SERVICE_TYPE_INVALID = -1
034c6ed7 74} ServiceType;
5cb5a6ff
LP
75
76typedef enum ServiceExecCommand {
77 SERVICE_EXEC_START_PRE,
78 SERVICE_EXEC_START,
79 SERVICE_EXEC_START_POST,
5cb5a6ff 80 SERVICE_EXEC_RELOAD,
5cb5a6ff
LP
81 SERVICE_EXEC_STOP,
82 SERVICE_EXEC_STOP_POST,
e537352b
LP
83 _SERVICE_EXEC_COMMAND_MAX,
84 _SERVICE_EXEC_COMMAND_INVALID = -1
5cb5a6ff
LP
85} ServiceExecCommand;
86
c952c6ec
LP
87typedef enum NotifyAccess {
88 NOTIFY_NONE,
89 NOTIFY_ALL,
90 NOTIFY_MAIN,
91 _NOTIFY_ACCESS_MAX,
92 _NOTIFY_ACCESS_INVALID = -1
93} NotifyAccess;
94
308d72dc
LP
95typedef enum NotifyState {
96 NOTIFY_UNKNOWN,
97 NOTIFY_READY,
98 NOTIFY_RELOADING,
99 NOTIFY_STOPPING,
100 _NOTIFY_STATE_MAX,
101 _NOTIFY_STATE_INVALID = -1
102} NotifyState;
103
f42806df
LP
104typedef enum ServiceResult {
105 SERVICE_SUCCESS,
106 SERVICE_FAILURE_RESOURCES,
107 SERVICE_FAILURE_TIMEOUT,
108 SERVICE_FAILURE_EXIT_CODE,
109 SERVICE_FAILURE_SIGNAL,
110 SERVICE_FAILURE_CORE_DUMP,
bb242b7b 111 SERVICE_FAILURE_WATCHDOG,
8d1b002a 112 SERVICE_FAILURE_START_LIMIT,
f42806df
LP
113 _SERVICE_RESULT_MAX,
114 _SERVICE_RESULT_INVALID = -1
115} ServiceResult;
116
a354329f
LP
117struct ServiceFDStore {
118 Service *service;
119
120 int fd;
121 sd_event_source *event_source;
122
123 LIST_FIELDS(ServiceFDStore, fd_store);
124};
125
5cb5a6ff 126struct Service {
ac155bb8 127 Unit meta;
5cb5a6ff 128
034c6ed7
LP
129 ServiceType type;
130 ServiceRestart restart;
37520c1b
LP
131 ExitStatusSet restart_prevent_status;
132 ExitStatusSet restart_force_status;
96342de6 133 ExitStatusSet success_status;
034c6ed7
LP
134
135 /* If set we'll read the main daemon PID from this file */
136 char *pid_file;
137
138 usec_t restart_usec;
d568a335
MS
139 usec_t timeout_start_usec;
140 usec_t timeout_stop_usec;
5cb5a6ff 141
a6927d7f 142 dual_timestamp watchdog_timestamp;
bb242b7b 143 usec_t watchdog_usec;
718db961 144 sd_event_source *watchdog_event_source;
a6927d7f 145
e537352b 146 ExecCommand* exec_command[_SERVICE_EXEC_COMMAND_MAX];
4819ff03 147
5cb5a6ff 148 ExecContext exec_context;
4819ff03 149 KillContext kill_context;
4ad49000 150 CGroupContext cgroup_context;
5cb5a6ff 151
a16e1123 152 ServiceState state, deserialized_state;
034c6ed7 153
867b3b7d 154 /* The exit status of the real main process */
034c6ed7
LP
155 ExecStatus main_exec_status;
156
867b3b7d 157 /* The currently executed control process */
034c6ed7 158 ExecCommand *control_command;
867b3b7d
LP
159
160 /* The currently executed main process, which may be NULL if
161 * the main process got started via forking mode and not by
162 * us */
163 ExecCommand *main_command;
164
165 /* The ID of the control command currently being executed */
a16e1123 166 ServiceExecCommand control_command_id;
867b3b7d 167
613b411c
LP
168 /* Runtime data of the execution context */
169 ExecRuntime *exec_runtime;
170
034c6ed7 171 pid_t main_pid, control_pid;
07459bb6 172 int socket_fd;
16115b0a 173 bool socket_fd_selinux_context_net;
8fe914ec 174
e44da745
DM
175 int bus_endpoint_fd;
176
8fe914ec
LP
177 bool permissions_start_only;
178 bool root_directory_start_only;
02ee865a 179 bool remain_after_exit;
3185a36b 180 bool guess_main_pid;
8fe914ec 181
05e343b7 182 /* If we shut down, remember why */
f42806df
LP
183 ServiceResult result;
184 ServiceResult reload_result;
e2f3b44c 185
5de6b302 186 bool main_pid_known:1;
6dfa5494 187 bool main_pid_alien:1;
05e343b7 188 bool bus_name_good:1;
47342320 189 bool forbid_restart:1;
d568a335 190 bool start_timeout_defined:1;
2c4104f0 191
5ad096b3
LP
192 bool reset_cpu_usage:1;
193
05e343b7
LP
194 char *bus_name;
195
8c47c732 196 char *status_text;
4774e357 197 int status_errno;
8c47c732 198
4b939747 199 RateLimit start_limit;
bf500566 200 FailureAction start_limit_action;
2928b0a8 201 FailureAction failure_action;
efe6e7d3 202 char *reboot_arg;
4b939747 203
57020a3a 204 UnitRef accept_socket;
4f2d528d 205
718db961 206 sd_event_source *timer_event_source;
3a111838 207 PathSpec *pid_file_pathspec;
8fe914ec
LP
208
209 NotifyAccess notify_access;
308d72dc 210 NotifyState notify_state;
a354329f
LP
211
212 ServiceFDStore *fd_store;
213 unsigned n_fd_store;
214 unsigned n_fd_store_max;
5cb5a6ff
LP
215};
216
47be870b 217extern const UnitVTable service_vtable;
5cb5a6ff 218
57020a3a
LP
219struct Socket;
220
16115b0a 221int service_set_socket_fd(Service *s, int fd, struct Socket *socket, bool selinux_context_net);
4f2d528d 222
44a6b1b6
ZJS
223const char* service_state_to_string(ServiceState i) _const_;
224ServiceState service_state_from_string(const char *s) _pure_;
94f04347 225
44a6b1b6
ZJS
226const char* service_restart_to_string(ServiceRestart i) _const_;
227ServiceRestart service_restart_from_string(const char *s) _pure_;
94f04347 228
44a6b1b6
ZJS
229const char* service_type_to_string(ServiceType i) _const_;
230ServiceType service_type_from_string(const char *s) _pure_;
94f04347 231
44a6b1b6
ZJS
232const char* service_exec_command_to_string(ServiceExecCommand i) _const_;
233ServiceExecCommand service_exec_command_from_string(const char *s) _pure_;
94f04347 234
44a6b1b6
ZJS
235const char* notify_access_to_string(NotifyAccess i) _const_;
236NotifyAccess notify_access_from_string(const char *s) _pure_;
c952c6ec 237
308d72dc
LP
238const char* notify_state_to_string(NotifyState i) _const_;
239NotifyState notify_state_from_string(const char *s) _pure_;
240
44a6b1b6
ZJS
241const char* service_result_to_string(ServiceResult i) _const_;
242ServiceResult service_result_from_string(const char *s) _pure_;