diff --git a/man/custom-entities.ent.in b/man/custom-entities.ent.in
index 6d662a380a..0376e0feb9 100644
--- a/man/custom-entities.ent.in
+++ b/man/custom-entities.ent.in
@@ -15,5 +15,7 @@
+
+
diff --git a/man/systemd-system.conf.xml b/man/systemd-system.conf.xml
index 481fa31e01..82a52e2150 100644
--- a/man/systemd-system.conf.xml
+++ b/man/systemd-system.conf.xml
@@ -349,25 +349,20 @@
DefaultTimeoutAbortSec=
DefaultRestartSec=
- Configures the default timeouts for starting,
- stopping and aborting of units, as well as the default time to sleep
- between automatic restarts of units, as configured per-unit in
- TimeoutStartSec=,
- TimeoutStopSec=,
- TimeoutAbortSec= and
- RestartSec= (for services, see
+ Configures the default timeouts for starting, stopping and aborting of units, as well
+ as the default time to sleep between automatic restarts of units, as configured per-unit in
+ TimeoutStartSec=, TimeoutStopSec=,
+ TimeoutAbortSec= and RestartSec= (for services, see
systemd.service5
- for details on the per-unit settings). Disabled by default, when
- service with Type=oneshot is used.
- For non-service units,
- DefaultTimeoutStartSec= sets the default
- TimeoutSec=
- value. DefaultTimeoutStartSec= and
- DefaultTimeoutStopSec= default to
- 90s. DefaultTimeoutAbortSec= is not set by default
- so that all units fall back to TimeoutStopSec=.
- DefaultRestartSec= defaults to
- 100ms.
+ for details on the per-unit settings). For non-service units,
+ DefaultTimeoutStartSec= sets the default TimeoutSec= value.
+
+
+ DefaultTimeoutStartSec= and DefaultTimeoutStopSec=
+ default to &DEFAULT_TIMEOUT; in the system manager and &DEFAULT_USER_TIMEOUT; in the user manager.
+ DefaultTimeoutAbortSec= is not set by default so that all units fall back to
+ TimeoutStopSec=. DefaultRestartSec= defaults to 100 ms.
+
@@ -378,7 +373,8 @@
and /etc/crypttab (see
systemd.mount5,
crypttab5).
- Defaults to 90s.
+ Defaults to &DEFAULT_TIMEOUT; in the system manager and &DEFAULT_USER_TIMEOUT; in the user manager.
+
diff --git a/man/systemd.service.xml b/man/systemd.service.xml
index d44c48c7b1..a1a32e8cd9 100644
--- a/man/systemd.service.xml
+++ b/man/systemd.service.xml
@@ -612,11 +612,12 @@
TimeoutStartSec=
- Configures the time to wait for start-up. If a daemon service does not signal start-up
- completion within the configured time, the service will be considered failed and will be shut down again. The
- precise action depends on the TimeoutStartFailureMode= option. Takes a unit-less value in
- seconds, or a time span value such as "5min 20s". Pass infinity to disable the timeout logic.
- Defaults to DefaultTimeoutStartSec= from the manager configuration file, except when
+ Configures the time to wait for start-up. If a daemon service does not signal
+ start-up completion within the configured time, the service will be considered failed and will be
+ shut down again. The precise action depends on the TimeoutStartFailureMode=
+ option. Takes a unit-less value in seconds, or a time span value such as "5min 20s". Pass
+ infinity to disable the timeout logic. Defaults to
+ DefaultTimeoutStartSec= set in the manager, except when
Type=oneshot is used, in which case the timeout is disabled by default (see
systemd-system.conf5).
diff --git a/meson.build b/meson.build
index a856bb2f84..97246a3c6f 100644
--- a/meson.build
+++ b/meson.build
@@ -294,7 +294,6 @@ conf.set_quoted('USER_TMPFILES_DIR', usertmpfilesdir)
conf.set_quoted('UDEVLIBEXECDIR', udevlibexecdir)
conf.set_quoted('UDEV_HWDB_DIR', udevhwdbdir)
conf.set_quoted('UDEV_RULES_DIR', udevrulesdir)
-conf.set_quoted('UPDATE_HELPER_USER_TIMEOUT', get_option('update-helper-user-timeout'))
conf.set_quoted('USER_CONFIG_UNIT_DIR', pkgsysconfdir / 'user')
conf.set_quoted('USER_DATA_UNIT_DIR', userunitdir)
conf.set_quoted('USER_ENV_GENERATOR_DIR', userenvgeneratordir)
@@ -310,6 +309,10 @@ conf.set10('MEMORY_ACCOUNTING_DEFAULT', memory_accounting_
conf.set('STATUS_UNIT_FORMAT_DEFAULT', 'STATUS_UNIT_FORMAT_' + status_unit_format_default.to_upper())
conf.set_quoted('STATUS_UNIT_FORMAT_DEFAULT_STR', status_unit_format_default)
+conf.set('DEFAULT_TIMEOUT_SEC', get_option('default-timeout-sec'))
+conf.set('DEFAULT_USER_TIMEOUT_SEC', get_option('default-user-timeout-sec'))
+conf.set('UPDATE_HELPER_USER_TIMEOUT_SEC', get_option('update-helper-user-timeout-sec'))
+
conf.set10('FIRST_BOOT_FULL_PRESET', get_option('first-boot-full-preset'))
#####################################################################
diff --git a/meson_options.txt b/meson_options.txt
index 8ce245dbb9..17c88e23a1 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -187,6 +187,10 @@ option('dbussystemservicedir', type : 'string',
description : 'D-Bus system service directory')
option('dbus-interfaces-dir', type : 'string',
description : 'export D-Bus introspection XML as standalone files')
+option('default-timeout-sec', type : 'integer', value : 90,
+ description : 'default timeout for system unit start/stop')
+option('default-user-timeout-sec', type : 'integer', value : 90,
+ description : 'default timeout for user unit start/stop')
option('pkgconfigdatadir', type : 'string', value : '',
description : 'directory for arch-independent pkg-config files')
option('pkgconfiglibdir', type : 'string', value : '',
@@ -195,8 +199,8 @@ option('xinitrcdir', type : 'string', value : '',
description : 'directory for xinitrc files')
option('rpmmacrosdir', type : 'string', value : 'lib/rpm/macros.d',
description : 'directory for rpm macros ["no" disables]')
-option('update-helper-user-timeout', type : 'string', value : '15s',
- description : 'how long to wait for user manager operations')
+option('update-helper-user-timeout-sec', type : 'integer', value : 15,
+ description : 'timeout for user manager package operations')
option('pamlibdir', type : 'string',
description : 'directory for PAM modules')
option('pamconfdir', type : 'string',
diff --git a/src/basic/constants.h b/src/basic/constants.h
index 4a24ba9c8c..5d68cc6332 100644
--- a/src/basic/constants.h
+++ b/src/basic/constants.h
@@ -25,8 +25,13 @@
# endif
#endif
-#define DEFAULT_TIMEOUT_USEC (90*USEC_PER_SEC)
#define DEFAULT_RESTART_USEC (100*USEC_PER_MSEC)
+
+/* Many different things, but also system unit start/stop */
+#define DEFAULT_TIMEOUT_USEC (DEFAULT_TIMEOUT_SEC*USEC_PER_SEC)
+/* User unit start/stop */
+#define DEFAULT_USER_TIMEOUT_USEC (DEFAULT_USER_TIMEOUT_SEC*USEC_PER_SEC)
+/* Timeout for user confirmation on the console */
#define DEFAULT_CONFIRM_USEC (30*USEC_PER_SEC)
/* We use an extra-long timeout for the reload. This is because a reload or reexec means generators are rerun
diff --git a/src/core/main.c b/src/core/main.c
index a7cdc8d631..867f3c7adc 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -2436,11 +2436,11 @@ static void reset_arguments(void) {
arg_default_std_output = EXEC_OUTPUT_JOURNAL;
arg_default_std_error = EXEC_OUTPUT_INHERIT;
arg_default_restart_usec = DEFAULT_RESTART_USEC;
- arg_default_timeout_start_usec = DEFAULT_TIMEOUT_USEC;
- arg_default_timeout_stop_usec = DEFAULT_TIMEOUT_USEC;
- arg_default_timeout_abort_usec = DEFAULT_TIMEOUT_USEC;
+ arg_default_timeout_start_usec = manager_default_timeout(arg_system);
+ arg_default_timeout_stop_usec = manager_default_timeout(arg_system);
+ arg_default_timeout_abort_usec = manager_default_timeout(arg_system);
arg_default_timeout_abort_set = false;
- arg_default_device_timeout_usec = DEFAULT_TIMEOUT_USEC;
+ arg_default_device_timeout_usec = manager_default_timeout(arg_system);
arg_default_start_limit_interval = DEFAULT_START_LIMIT_INTERVAL;
arg_default_start_limit_burst = DEFAULT_START_LIMIT_BURST;
arg_runtime_watchdog = 0;
diff --git a/src/core/manager.c b/src/core/manager.c
index d39e917134..67bab54b9b 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -835,10 +835,10 @@ int manager_new(LookupScope scope, ManagerTestRunFlags test_run_flags, Manager *
.default_memory_accounting = MEMORY_ACCOUNTING_DEFAULT,
.default_tasks_accounting = true,
.default_tasks_max = TASKS_MAX_UNSET,
- .default_timeout_start_usec = DEFAULT_TIMEOUT_USEC,
- .default_timeout_stop_usec = DEFAULT_TIMEOUT_USEC,
+ .default_timeout_start_usec = manager_default_timeout(scope == LOOKUP_SCOPE_SYSTEM),
+ .default_timeout_stop_usec = manager_default_timeout(scope == LOOKUP_SCOPE_SYSTEM),
.default_restart_usec = DEFAULT_RESTART_USEC,
- .default_device_timeout_usec = DEFAULT_TIMEOUT_USEC,
+ .default_device_timeout_usec = manager_default_timeout(scope == LOOKUP_SCOPE_SYSTEM),
.original_log_level = -1,
.original_log_target = _LOG_TARGET_INVALID,
diff --git a/src/core/manager.h b/src/core/manager.h
index c13de8fe78..e7b594fdd3 100644
--- a/src/core/manager.h
+++ b/src/core/manager.h
@@ -485,6 +485,10 @@ static inline usec_t manager_default_timeout_abort_usec(Manager *m) {
#define MANAGER_IS_TEST_RUN(m) ((m)->test_run_flags != 0)
+static inline usec_t manager_default_timeout(bool is_system) {
+ return is_system ? DEFAULT_TIMEOUT_USEC : DEFAULT_USER_TIMEOUT_USEC;
+}
+
int manager_new(LookupScope scope, ManagerTestRunFlags test_run_flags, Manager **m);
Manager* manager_free(Manager *m);
DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
diff --git a/src/core/system.conf.in b/src/core/system.conf.in
index 531a7694d9..0c27586c46 100644
--- a/src/core/system.conf.in
+++ b/src/core/system.conf.in
@@ -43,10 +43,10 @@
#DefaultTimerAccuracySec=1min
#DefaultStandardOutput=journal
#DefaultStandardError=inherit
-#DefaultTimeoutStartSec=90s
-#DefaultTimeoutStopSec=90s
+#DefaultTimeoutStartSec={{DEFAULT_TIMEOUT_SEC}}s
+#DefaultTimeoutStopSec={{DEFAULT_TIMEOUT_SEC}}s
#DefaultTimeoutAbortSec=
-#DefaultDeviceTimeoutSec=90s
+#DefaultDeviceTimeoutSec={{DEFAULT_TIMEOUT_SEC}}s
#DefaultRestartSec=100ms
#DefaultStartLimitIntervalSec=10s
#DefaultStartLimitBurst=5
diff --git a/src/core/user.conf.in b/src/core/user.conf.in
index b4938942d1..d67650b858 100644
--- a/src/core/user.conf.in
+++ b/src/core/user.conf.in
@@ -24,9 +24,10 @@
#DefaultTimerAccuracySec=1min
#DefaultStandardOutput=inherit
#DefaultStandardError=inherit
-#DefaultTimeoutStartSec=90s
-#DefaultTimeoutStopSec=90s
+#DefaultTimeoutStartSec={{DEFAULT_USER_TIMEOUT_SEC}}s
+#DefaultTimeoutStopSec={{DEFAULT_USER_TIMEOUT_SEC}}s
#DefaultTimeoutAbortSec=
+#DefaultDeviceTimeoutSec={{DEFAULT_USER_TIMEOUT_SEC}}s
#DefaultRestartSec=100ms
#DefaultStartLimitIntervalSec=10s
#DefaultStartLimitBurst=5
diff --git a/src/rpm/systemd-update-helper.in b/src/rpm/systemd-update-helper.in
index b35d952fab..c623a5ea17 100755
--- a/src/rpm/systemd-update-helper.in
+++ b/src/rpm/systemd-update-helper.in
@@ -32,7 +32,7 @@ case "$command" in
users=$(systemctl list-units 'user@*' --legend=no | sed -n -r 's/.*user@([0-9]+).service.*/\1/p')
for user in $users; do
- SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT}} \
+ SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT_SEC}}s \
systemctl --user -M "$user@" disable --now --no-warn "$@" &
done
wait
@@ -53,7 +53,7 @@ case "$command" in
users=$(systemctl list-units 'user@*' --legend=no | sed -n -r 's/.*user@([0-9]+).service.*/\1/p')
for user in $users; do
for unit in "$@"; do
- SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT}} \
+ SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT_SEC}}s \
systemctl --user -M "$user@" set-property "$unit" Markers=+needs-restart &
done
done
@@ -89,7 +89,7 @@ case "$command" in
if [[ "$command" =~ reexec ]]; then
for user in $users; do
- SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT}} \
+ SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT_SEC}}s \
systemctl --user -M "$user@" daemon-reexec &
done
wait
@@ -97,7 +97,7 @@ case "$command" in
if [[ "$command" =~ reload ]]; then
for user in $users; do
- SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT}} \
+ SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT_SEC}}s \
systemctl --user -M "$user@" daemon-reload &
done
wait
@@ -105,7 +105,7 @@ case "$command" in
if [[ "$command" =~ restart ]]; then
for user in $users; do
- SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT}} \
+ SYSTEMD_BUS_TIMEOUT={{UPDATE_HELPER_USER_TIMEOUT_SEC}}s \
systemctl --user -M "$user@" reload-or-restart --marked &
done
wait
diff --git a/units/user@.service.in b/units/user@.service.in
index 1558764909..5e95efe1d1 100644
--- a/units/user@.service.in
+++ b/units/user@.service.in
@@ -23,6 +23,6 @@ Slice=user-%i.slice
KillMode=mixed
Delegate=pids memory cpu
TasksMax=infinity
-TimeoutStopSec=120s
+TimeoutStopSec={{ DEFAULT_USER_TIMEOUT_SEC*4//3 }}s
KeyringMode=inherit
OOMScoreAdjust=100