diff --git a/src/core/execute.c b/src/core/execute.c index c7b324ffa8..53aed1f287 100644 --- a/src/core/execute.c +++ b/src/core/execute.c @@ -2385,7 +2385,7 @@ static int exec_child( exec_context_tty_reset(context, params); - if (!manager_is_confirm_spawn_disabled(unit->manager)) { + if (unit_shall_confirm_spawn(unit)) { const char *vc = params->confirm_spawn; _cleanup_free_ char *cmdline = NULL; diff --git a/src/core/unit.c b/src/core/unit.c index bba0f5d357..7b78ba9a9e 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -1515,6 +1515,17 @@ int unit_start_limit_test(Unit *u) { return emergency_action(u->manager, u->start_limit_action, u->reboot_arg, "unit failed"); } +bool unit_shall_confirm_spawn(Unit *u) { + + if (manager_is_confirm_spawn_disabled(u->manager)) + return false; + + /* For some reasons units remaining in the same process group + * as PID 1 fail to acquire the console even if it's not used + * by any process. So skip the confirmation question for them. */ + return !unit_get_exec_context(u)->same_pgrp; +} + /* Errors: * -EBADR: This unit type does not support starting. * -EALREADY: Unit is already started. diff --git a/src/core/unit.h b/src/core/unit.h index 991543664b..1ef92f3263 100644 --- a/src/core/unit.h +++ b/src/core/unit.h @@ -654,6 +654,8 @@ void unit_notify_user_lookup(Unit *u, uid_t uid, gid_t gid); int unit_set_invocation_id(Unit *u, sd_id128_t id); int unit_acquire_invocation_id(Unit *u); +bool unit_shall_confirm_spawn(Unit *u); + /* Macros which append UNIT= or USER_UNIT= to the message */ #define log_unit_full(unit, level, error, ...) \