diff --git a/man/systemctl.xml b/man/systemctl.xml index 83cc4eb560..0778c38ca4 100644 --- a/man/systemctl.xml +++ b/man/systemctl.xml @@ -295,7 +295,8 @@ transactions from replacing these jobs (or even being enqueued while the irreversible jobs are still pending). Irreversible jobs can still be cancelled using the cancel - command. + command. This job mode should be used on any transaction which + pulls in shutdown.target. isolate is only valid for start operations and causes all other units to be stopped when the diff --git a/man/systemd.special.xml b/man/systemd.special.xml index b4ed3eb8f2..9c916bee6f 100644 --- a/man/systemd.special.xml +++ b/man/systemd.special.xml @@ -238,8 +238,7 @@ poweroff.target on non-container systems, and also works in containers. - systemd will start this unit when it receives a - request to shut down over D-Bus or a + systemd will start this unit when it receives the SIGTERM or SIGINT signal when running as user service daemon. diff --git a/man/systemd.xml b/man/systemd.xml index e8178ca4bb..b455b605cb 100644 --- a/man/systemd.xml +++ b/man/systemd.xml @@ -561,7 +561,8 @@ systemd user managers will start the exit.target unit when this signal is received. This is mostly equivalent to systemctl - --user start exit.target. + --user start exit.target + --job-mode=replace-irreversible. @@ -570,13 +571,13 @@ Upon receiving this signal the systemd system manager will start the ctrl-alt-del.target unit. This is mostly - equivalent to systemctl start - ctl-alt-del.target. If this signal is received more - than 7 times per 2s, an immediate reboot is triggered. - Note that pressing Ctrl-Alt-Del on the console will trigger - this signal. Hence, if a reboot is hanging, pressing - Ctrl-Alt-Del more than 7 times in 2s is a relatively safe way - to trigger an immediate reboot. + equivalent to systemctl start ctl-alt-del.target + --job-mode=replace-irreversible. If this signal is + received more than 7 times per 2s, an immediate reboot is + triggered. Note that pressing Ctrl-Alt-Del on the console + will trigger this signal. Hence, if a reboot is hanging, + pressing Ctrl-Alt-Del more than 7 times in 2s is a relatively + safe way to trigger an immediate reboot. systemd user managers treat this signal the same way as SIGTERM. @@ -634,7 +635,7 @@ Enters default mode, starts the default.target unit. This is mostly - equivalent to systemctl start + equivalent to systemctl isolate default.target. @@ -661,8 +662,9 @@ Halts the machine, starts the halt.target unit. This is mostly - equivalent to systemctl start - halt.target. + equivalent to systemctl start halt.target + --job-mode=replace-irreversible. + @@ -670,8 +672,9 @@ Powers off the machine, starts the poweroff.target unit. This is mostly - equivalent to systemctl start - poweroff.target. + equivalent to systemctl start poweroff.target + --job-mode=replace-irreversible. + @@ -679,8 +682,9 @@ Reboots the machine, starts the reboot.target unit. This is mostly - equivalent to systemctl start - reboot.target. + equivalent to systemctl start reboot.target + --job-mode=replace-irreversible. + @@ -688,8 +692,9 @@ Reboots the machine via kexec, starts the kexec.target unit. This is mostly - equivalent to systemctl start - kexec.target. + equivalent to systemctl start kexec.target + --job-mode=replace-irreversible. + diff --git a/src/core/manager.c b/src/core/manager.c index 4d215d5692..939d117ad1 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -2012,7 +2012,7 @@ static int manager_dispatch_sigchld(Manager *m) { return 0; } -static int manager_start_target(Manager *m, const char *name, JobMode mode) { +static void manager_start_target(Manager *m, const char *name, JobMode mode) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; int r; @@ -2021,8 +2021,6 @@ static int manager_start_target(Manager *m, const char *name, JobMode mode) { r = manager_add_job_by_name(m, JOB_START, name, mode, &error, NULL); if (r < 0) log_error("Failed to enqueue %s job: %s", name, bus_error_message(&error, r)); - - return r; } static void manager_handle_ctrl_alt_del(Manager *m) { @@ -2092,17 +2090,11 @@ static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t /* Fall through */ case SIGINT: - if (MANAGER_IS_SYSTEM(m)) { + if (MANAGER_IS_SYSTEM(m)) manager_handle_ctrl_alt_del(m); - break; - } - - /* Run the exit target if there is one, if not, just exit. */ - if (manager_start_target(m, SPECIAL_EXIT_TARGET, JOB_REPLACE) < 0) { - m->exit_code = MANAGER_EXIT; - return 0; - } - + else + manager_start_target(m, SPECIAL_EXIT_TARGET, + JOB_REPLACE_IRREVERSIBLY); break; case SIGWINCH: @@ -2170,14 +2162,17 @@ static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t default: { /* Starting SIGRTMIN+0 */ - static const char * const target_table[] = { - [0] = SPECIAL_DEFAULT_TARGET, - [1] = SPECIAL_RESCUE_TARGET, - [2] = SPECIAL_EMERGENCY_TARGET, - [3] = SPECIAL_HALT_TARGET, - [4] = SPECIAL_POWEROFF_TARGET, - [5] = SPECIAL_REBOOT_TARGET, - [6] = SPECIAL_KEXEC_TARGET + static const struct { + const char *target; + JobMode mode; + } target_table[] = { + [0] = { SPECIAL_DEFAULT_TARGET, JOB_ISOLATE }, + [1] = { SPECIAL_RESCUE_TARGET, JOB_ISOLATE }, + [2] = { SPECIAL_EMERGENCY_TARGET, JOB_ISOLATE }, + [3] = { SPECIAL_HALT_TARGET, JOB_REPLACE_IRREVERSIBLY }, + [4] = { SPECIAL_POWEROFF_TARGET, JOB_REPLACE_IRREVERSIBLY }, + [5] = { SPECIAL_REBOOT_TARGET, JOB_REPLACE_IRREVERSIBLY }, + [6] = { SPECIAL_KEXEC_TARGET, JOB_REPLACE_IRREVERSIBLY } }; /* Starting SIGRTMIN+13, so that target halt and system halt are 10 apart */ @@ -2191,8 +2186,8 @@ static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t if ((int) sfsi.ssi_signo >= SIGRTMIN+0 && (int) sfsi.ssi_signo < SIGRTMIN+(int) ELEMENTSOF(target_table)) { int idx = (int) sfsi.ssi_signo - SIGRTMIN; - manager_start_target(m, target_table[idx], - (idx == 1 || idx == 2) ? JOB_ISOLATE : JOB_REPLACE); + manager_start_target(m, target_table[idx].target, + target_table[idx].mode); break; } diff --git a/units/rescue.target b/units/rescue.target index 3f59b14339..bd92ed2df3 100644 --- a/units/rescue.target +++ b/units/rescue.target @@ -11,6 +11,3 @@ Documentation=man:systemd.special(7) Requires=sysinit.target rescue.service After=sysinit.target rescue.service AllowIsolate=yes - -[Install] -Alias=kbrequest.target