1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 This file is part of systemd.
5 Copyright 2013 Lennart Poettering
7 systemd is free software; you can redistribute it and/or modify it
8 under the terms of the GNU Lesser General Public License as published by
9 the Free Software Foundation; either version 2.1 of the License, or
10 (at your option) any later version.
12 systemd is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 Lesser General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with systemd; If not, see <http://www.gnu.org/licenses/>.
24 #include "alloc-util.h"
25 #include "dbus-scope.h"
26 #include "load-dropin.h"
30 #include "string-table.h"
31 #include "string-util.h"
33 #include "unit-name.h"
36 static const UnitActiveState state_translation_table
[_SCOPE_STATE_MAX
] = {
37 [SCOPE_DEAD
] = UNIT_INACTIVE
,
38 [SCOPE_RUNNING
] = UNIT_ACTIVE
,
39 [SCOPE_ABANDONED
] = UNIT_ACTIVE
,
40 [SCOPE_STOP_SIGTERM
] = UNIT_DEACTIVATING
,
41 [SCOPE_STOP_SIGKILL
] = UNIT_DEACTIVATING
,
42 [SCOPE_FAILED
] = UNIT_FAILED
45 static int scope_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
);
47 static void scope_init(Unit
*u
) {
51 assert(u
->load_state
== UNIT_STUB
);
53 s
->timeout_stop_usec
= u
->manager
->default_timeout_stop_usec
;
54 u
->ignore_on_isolate
= true;
57 static void scope_done(Unit
*u
) {
64 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
67 static int scope_arm_timer(Scope
*s
, usec_t usec
) {
72 if (s
->timer_event_source
) {
73 r
= sd_event_source_set_time(s
->timer_event_source
, usec
);
77 return sd_event_source_set_enabled(s
->timer_event_source
, SD_EVENT_ONESHOT
);
80 if (usec
== USEC_INFINITY
)
83 r
= sd_event_add_time(
84 UNIT(s
)->manager
->event
,
85 &s
->timer_event_source
,
88 scope_dispatch_timer
, s
);
92 (void) sd_event_source_set_description(s
->timer_event_source
, "scope-timer");
97 static void scope_set_state(Scope
*s
, ScopeState state
) {
101 old_state
= s
->state
;
104 if (!IN_SET(state
, SCOPE_STOP_SIGTERM
, SCOPE_STOP_SIGKILL
))
105 s
->timer_event_source
= sd_event_source_unref(s
->timer_event_source
);
107 if (IN_SET(state
, SCOPE_DEAD
, SCOPE_FAILED
))
108 unit_unwatch_all_pids(UNIT(s
));
110 if (state
!= old_state
)
111 log_debug("%s changed %s -> %s", UNIT(s
)->id
, scope_state_to_string(old_state
), scope_state_to_string(state
));
113 unit_notify(UNIT(s
), state_translation_table
[old_state
], state_translation_table
[state
], true);
116 static int scope_add_default_dependencies(Scope
*s
) {
121 if (!UNIT(s
)->default_dependencies
)
124 /* Make sure scopes are unloaded on shutdown */
125 r
= unit_add_two_dependencies_by_name(
127 UNIT_BEFORE
, UNIT_CONFLICTS
,
128 SPECIAL_SHUTDOWN_TARGET
, NULL
, true,
129 UNIT_DEPENDENCY_DEFAULT
);
136 static int scope_verify(Scope
*s
) {
139 if (UNIT(s
)->load_state
!= UNIT_LOADED
)
142 if (set_isempty(UNIT(s
)->pids
) &&
143 !MANAGER_IS_RELOADING(UNIT(s
)->manager
) &&
144 !unit_has_name(UNIT(s
), SPECIAL_INIT_SCOPE
)) {
145 log_unit_error(UNIT(s
), "Scope has no PIDs. Refusing.");
152 static int scope_load_init_scope(Unit
*u
) {
155 if (!unit_has_name(u
, SPECIAL_INIT_SCOPE
))
161 /* init.scope is a bit special, as it has to stick around forever. Because of its special semantics we
162 * synthesize it here, instead of relying on the unit file on disk. */
164 u
->default_dependencies
= false;
165 u
->ignore_on_isolate
= true;
167 SCOPE(u
)->kill_context
.kill_signal
= SIGRTMIN
+14;
169 /* Prettify things, if we can. */
171 u
->description
= strdup("System and Service Manager");
172 if (!u
->documentation
)
173 (void) strv_extend(&u
->documentation
, "man:systemd(1)");
178 static int scope_load(Unit
*u
) {
183 assert(u
->load_state
== UNIT_STUB
);
185 if (!u
->transient
&& !MANAGER_IS_RELOADING(u
->manager
))
186 /* Refuse to load non-transient scope units, but allow them while reloading. */
189 r
= scope_load_init_scope(u
);
192 r
= unit_load_fragment_and_dropin_optional(u
);
196 if (u
->load_state
== UNIT_LOADED
) {
197 r
= unit_patch_contexts(u
);
201 r
= unit_set_default_slice(u
);
205 r
= scope_add_default_dependencies(s
);
210 return scope_verify(s
);
213 static int scope_coldplug(Unit
*u
) {
218 assert(s
->state
== SCOPE_DEAD
);
220 if (s
->deserialized_state
== s
->state
)
223 if (IN_SET(s
->deserialized_state
, SCOPE_STOP_SIGKILL
, SCOPE_STOP_SIGTERM
)) {
224 r
= scope_arm_timer(s
, usec_add(u
->state_change_timestamp
.monotonic
, s
->timeout_stop_usec
));
229 if (!IN_SET(s
->deserialized_state
, SCOPE_DEAD
, SCOPE_FAILED
))
230 unit_watch_all_pids(UNIT(s
));
232 scope_set_state(s
, s
->deserialized_state
);
236 static void scope_dump(Unit
*u
, FILE *f
, const char *prefix
) {
243 "%sScope State: %s\n"
245 prefix
, scope_state_to_string(s
->state
),
246 prefix
, scope_result_to_string(s
->result
));
248 cgroup_context_dump(&s
->cgroup_context
, f
, prefix
);
249 kill_context_dump(&s
->kill_context
, f
, prefix
);
252 static void scope_enter_dead(Scope
*s
, ScopeResult f
) {
255 if (s
->result
== SCOPE_SUCCESS
)
258 if (s
->result
!= SCOPE_SUCCESS
)
259 log_unit_warning(UNIT(s
), "Failed with result '%s'.", scope_result_to_string(s
->result
));
261 scope_set_state(s
, s
->result
!= SCOPE_SUCCESS
? SCOPE_FAILED
: SCOPE_DEAD
);
264 static void scope_enter_signal(Scope
*s
, ScopeState state
, ScopeResult f
) {
265 bool skip_signal
= false;
270 if (s
->result
== SCOPE_SUCCESS
)
273 unit_watch_all_pids(UNIT(s
));
275 /* If we have a controller set let's ask the controller nicely
276 * to terminate the scope, instead of us going directly into
277 * SIGTERM berserk mode */
278 if (state
== SCOPE_STOP_SIGTERM
)
279 skip_signal
= bus_scope_send_request_stop(s
) > 0;
284 r
= unit_kill_context(
287 state
!= SCOPE_STOP_SIGTERM
? KILL_KILL
:
288 s
->was_abandoned
? KILL_TERMINATE_AND_LOG
:
296 r
= scope_arm_timer(s
, usec_add(now(CLOCK_MONOTONIC
), s
->timeout_stop_usec
));
300 scope_set_state(s
, state
);
301 } else if (state
== SCOPE_STOP_SIGTERM
)
302 scope_enter_signal(s
, SCOPE_STOP_SIGKILL
, SCOPE_SUCCESS
);
304 scope_enter_dead(s
, SCOPE_SUCCESS
);
309 log_unit_warning_errno(UNIT(s
), r
, "Failed to kill processes: %m");
311 scope_enter_dead(s
, SCOPE_FAILURE_RESOURCES
);
314 static int scope_start(Unit
*u
) {
320 if (unit_has_name(u
, SPECIAL_INIT_SCOPE
))
323 if (s
->state
== SCOPE_FAILED
)
326 /* We can't fulfill this right now, please try again later */
327 if (IN_SET(s
->state
, SCOPE_STOP_SIGTERM
, SCOPE_STOP_SIGKILL
))
330 assert(s
->state
== SCOPE_DEAD
);
332 if (!u
->transient
&& !MANAGER_IS_RELOADING(u
->manager
))
335 r
= unit_acquire_invocation_id(u
);
339 (void) unit_realize_cgroup(u
);
340 (void) unit_reset_cpu_accounting(u
);
341 (void) unit_reset_ip_accounting(u
);
343 unit_export_state_files(UNIT(s
));
345 r
= unit_attach_pids_to_cgroup(u
);
347 log_unit_warning_errno(UNIT(s
), r
, "Failed to add PIDs to scope's control group: %m");
348 scope_enter_dead(s
, SCOPE_FAILURE_RESOURCES
);
352 s
->result
= SCOPE_SUCCESS
;
354 scope_set_state(s
, SCOPE_RUNNING
);
358 static int scope_stop(Unit
*u
) {
363 if (IN_SET(s
->state
, SCOPE_STOP_SIGTERM
, SCOPE_STOP_SIGKILL
))
366 assert(IN_SET(s
->state
, SCOPE_RUNNING
, SCOPE_ABANDONED
));
368 scope_enter_signal(s
, SCOPE_STOP_SIGTERM
, SCOPE_SUCCESS
);
372 static void scope_reset_failed(Unit
*u
) {
377 if (s
->state
== SCOPE_FAILED
)
378 scope_set_state(s
, SCOPE_DEAD
);
380 s
->result
= SCOPE_SUCCESS
;
383 static int scope_kill(Unit
*u
, KillWho who
, int signo
, sd_bus_error
*error
) {
384 return unit_kill_common(u
, who
, signo
, -1, -1, error
);
387 static int scope_get_timeout(Unit
*u
, usec_t
*timeout
) {
392 if (!s
->timer_event_source
)
395 r
= sd_event_source_get_time(s
->timer_event_source
, &t
);
398 if (t
== USEC_INFINITY
)
405 static int scope_serialize(Unit
*u
, FILE *f
, FDSet
*fds
) {
412 unit_serialize_item(u
, f
, "state", scope_state_to_string(s
->state
));
413 unit_serialize_item(u
, f
, "was-abandoned", yes_no(s
->was_abandoned
));
417 static int scope_deserialize_item(Unit
*u
, const char *key
, const char *value
, FDSet
*fds
) {
425 if (streq(key
, "state")) {
428 state
= scope_state_from_string(value
);
430 log_unit_debug(u
, "Failed to parse state value: %s", value
);
432 s
->deserialized_state
= state
;
434 } else if (streq(key
, "was-abandoned")) {
437 k
= parse_boolean(value
);
439 log_unit_debug(u
, "Failed to parse boolean value: %s", value
);
441 s
->was_abandoned
= k
;
443 log_unit_debug(u
, "Unknown serialization key: %s", key
);
448 static bool scope_check_gc(Unit
*u
) {
451 /* Never clean up scopes that still have a process around,
452 * even if the scope is formally dead. */
457 return cg_is_empty_recursive(SYSTEMD_CGROUP_CONTROLLER
, u
->cgroup_path
) <= 0;
460 static void scope_notify_cgroup_empty_event(Unit
*u
) {
464 log_unit_debug(u
, "cgroup is empty");
466 if (IN_SET(s
->state
, SCOPE_RUNNING
, SCOPE_ABANDONED
, SCOPE_STOP_SIGTERM
, SCOPE_STOP_SIGKILL
))
467 scope_enter_dead(s
, SCOPE_SUCCESS
);
470 static void scope_sigchld_event(Unit
*u
, pid_t pid
, int code
, int status
) {
472 /* If we get a SIGCHLD event for one of the processes we were
473 interested in, then we look for others to watch, under the
474 assumption that we'll sooner or later get a SIGCHLD for
475 them, as the original process we watched was probably the
476 parent of them, and they are hence now our children. */
478 unit_tidy_watch_pids(u
, 0, 0);
479 unit_watch_all_pids(u
);
481 /* If the PID set is empty now, then let's finish this off
482 (On unified we use proper notifications) */
483 if (cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER
) == 0 && set_isempty(u
->pids
))
484 scope_notify_cgroup_empty_event(u
);
487 static int scope_dispatch_timer(sd_event_source
*source
, usec_t usec
, void *userdata
) {
488 Scope
*s
= SCOPE(userdata
);
491 assert(s
->timer_event_source
== source
);
495 case SCOPE_STOP_SIGTERM
:
496 if (s
->kill_context
.send_sigkill
) {
497 log_unit_warning(UNIT(s
), "Stopping timed out. Killing.");
498 scope_enter_signal(s
, SCOPE_STOP_SIGKILL
, SCOPE_FAILURE_TIMEOUT
);
500 log_unit_warning(UNIT(s
), "Stopping timed out. Skipping SIGKILL.");
501 scope_enter_dead(s
, SCOPE_FAILURE_TIMEOUT
);
506 case SCOPE_STOP_SIGKILL
:
507 log_unit_warning(UNIT(s
), "Still around after SIGKILL. Ignoring.");
508 scope_enter_dead(s
, SCOPE_FAILURE_TIMEOUT
);
512 assert_not_reached("Timeout at wrong time.");
518 int scope_abandon(Scope
*s
) {
521 if (unit_has_name(UNIT(s
), SPECIAL_INIT_SCOPE
))
524 if (!IN_SET(s
->state
, SCOPE_RUNNING
, SCOPE_ABANDONED
))
527 s
->was_abandoned
= true;
528 s
->controller
= mfree(s
->controller
);
529 scope_set_state(s
, SCOPE_ABANDONED
);
531 /* The client is no longer watching the remaining processes,
532 * so let's step in here, under the assumption that the
533 * remaining processes will be sooner or later reassigned to
536 unit_tidy_watch_pids(UNIT(s
), 0, 0);
537 unit_watch_all_pids(UNIT(s
));
542 _pure_
static UnitActiveState
scope_active_state(Unit
*u
) {
545 return state_translation_table
[SCOPE(u
)->state
];
548 _pure_
static const char *scope_sub_state_to_string(Unit
*u
) {
551 return scope_state_to_string(SCOPE(u
)->state
);
554 static void scope_enumerate(Manager
*m
) {
560 /* Let's unconditionally add the "init.scope" special unit
561 * that encapsulates PID 1. Note that PID 1 already is in the
562 * cgroup for this, we hence just need to allocate the object
563 * for it and that's it. */
565 u
= manager_get_unit(m
, SPECIAL_INIT_SCOPE
);
567 r
= unit_new_for_name(m
, sizeof(Scope
), SPECIAL_INIT_SCOPE
, &u
);
569 log_error_errno(r
, "Failed to allocate the special " SPECIAL_INIT_SCOPE
" unit: %m");
576 SCOPE(u
)->deserialized_state
= SCOPE_RUNNING
;
578 unit_add_to_load_queue(u
);
579 unit_add_to_dbus_queue(u
);
582 static const char* const scope_result_table
[_SCOPE_RESULT_MAX
] = {
583 [SCOPE_SUCCESS
] = "success",
584 [SCOPE_FAILURE_RESOURCES
] = "resources",
585 [SCOPE_FAILURE_TIMEOUT
] = "timeout",
588 DEFINE_STRING_TABLE_LOOKUP(scope_result
, ScopeResult
);
590 const UnitVTable scope_vtable
= {
591 .object_size
= sizeof(Scope
),
592 .cgroup_context_offset
= offsetof(Scope
, cgroup_context
),
593 .kill_context_offset
= offsetof(Scope
, kill_context
),
599 .private_section
= "Scope",
601 .can_transient
= true,
607 .coldplug
= scope_coldplug
,
611 .start
= scope_start
,
616 .get_timeout
= scope_get_timeout
,
618 .serialize
= scope_serialize
,
619 .deserialize_item
= scope_deserialize_item
,
621 .active_state
= scope_active_state
,
622 .sub_state_to_string
= scope_sub_state_to_string
,
624 .check_gc
= scope_check_gc
,
626 .sigchld_event
= scope_sigchld_event
,
628 .reset_failed
= scope_reset_failed
,
630 .notify_cgroup_empty
= scope_notify_cgroup_empty_event
,
632 .bus_vtable
= bus_scope_vtable
,
633 .bus_set_property
= bus_scope_set_property
,
634 .bus_commit_properties
= bus_scope_commit_properties
,
636 .enumerate
= scope_enumerate
,