Merge pull request #10853 from poettering/thaw-containers

main: don't freeze PID 1 in containers, exit with non-zero instead
This commit is contained in:
Lennart Poettering 2018-11-20 19:35:30 +01:00 committed by GitHub
commit f81f8bac2c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 25 additions and 11 deletions

View File

@ -130,7 +130,14 @@ static uint64_t arg_default_tasks_max = UINT64_MAX;
static sd_id128_t arg_machine_id = {};
static EmergencyAction arg_cad_burst_action = EMERGENCY_ACTION_REBOOT_FORCE;
_noreturn_ static void freeze_or_reboot(void) {
_noreturn_ static void freeze_or_exit_or_reboot(void) {
/* If we are running in a contianer, let's prefer exiting, after all we can propagate an exit code to the
* container manager, and thus inform it that something went wrong. */
if (detect_container() > 0) {
log_emergency("Exiting PID 1...");
exit(EXIT_EXCEPTION);
}
if (arg_crash_reboot) {
log_notice("Rebooting in 10s...");
@ -185,7 +192,7 @@ _noreturn_ static void crash(int sig) {
(void) kill(pid, sig); /* raise() would kill the parent */
assert_not_reached("We shouldn't be here...");
_exit(EXIT_FAILURE);
_exit(EXIT_EXCEPTION);
} else {
siginfo_t status;
int r;
@ -231,14 +238,14 @@ _noreturn_ static void crash(int sig) {
(void) execle("/bin/sh", "/bin/sh", NULL, environ);
log_emergency_errno(errno, "execle() failed: %m");
_exit(EXIT_FAILURE);
_exit(EXIT_EXCEPTION);
} else {
log_info("Spawned crash shell as PID "PID_FMT".", pid);
(void) wait_for_terminate(pid, NULL);
}
}
freeze_or_reboot();
freeze_or_exit_or_reboot();
}
static void install_crash_handler(void) {
@ -2622,8 +2629,8 @@ finish:
if (error_message)
manager_status_printf(NULL, STATUS_TYPE_EMERGENCY,
ANSI_HIGHLIGHT_RED "!!!!!!" ANSI_NORMAL,
"%s, freezing.", error_message);
freeze_or_reboot();
"%s.", error_message);
freeze_or_exit_or_reboot();
}
return retval;

View File

@ -5,6 +5,8 @@
#include <sys/prctl.h>
#include <unistd.h>
#include "def.h"
#include "exit-status.h"
#include "fd-util.h"
#include "log.h"
#include "missing.h"
@ -12,7 +14,6 @@
#include "process-util.h"
#include "signal-util.h"
#include "time-util.h"
#include "def.h"
static int reset_environ(const char *new_environment, size_t length) {
unsigned long start, end;
@ -122,7 +123,7 @@ int stub_pid1(sd_id128_t uuid) {
if (si.si_pid == pid && si.si_code == CLD_EXITED)
r = si.si_status; /* pass on exit code */
else
r = 255; /* signal, coredump, timeout, … */
r = EXIT_EXCEPTION; /* signal, coredump, timeout, … */
goto finish;
}

View File

@ -19,9 +19,10 @@ const char* exit_status_to_string(int status, ExitStatusLevel level) {
* 79199 (Currently unmapped)
* 200241 systemd's private error codes (might be extended to 254 in future development)
* 242254 (Currently unmapped, but see above)
* 255 (We should probably stay away from that one, it's frequently used by applications to indicate an
* exit reason that cannot really be expressed in a single exit status value such as a propagated
* signal or such)
*
* 255 EXIT_EXCEPTION (We use this to propagate exit-by-signal events. It's frequently used by others apps (like bash)
* to indicate exit reason that cannot really be expressed in a single exit status value such as a propagated
* signal or such, and we follow that logic here.)
*/
switch (status) { /* We always cover the ISO C ones */
@ -155,6 +156,9 @@ const char* exit_status_to_string(int status, ExitStatusLevel level) {
case EXIT_CONFIGURATION_DIRECTORY:
return "CONFIGURATION_DIRECTORY";
case EXIT_EXCEPTION:
return "EXCEPTION";
}
}

View File

@ -69,6 +69,8 @@ enum {
EXIT_CACHE_DIRECTORY,
EXIT_LOGS_DIRECTORY, /* 240 */
EXIT_CONFIGURATION_DIRECTORY,
EXIT_EXCEPTION = 255, /* Whenever we want to propagate an abnormal/signal exit, in line with bash */
};
typedef enum ExitStatusLevel {