core: make log messages about unit processes exiting recognizable

This commit is contained in:
Lennart Poettering 2018-11-13 22:10:38 +01:00
parent 7c047d7443
commit 91bbd9b796
8 changed files with 69 additions and 25 deletions

View file

@ -359,6 +359,15 @@ Support: %SUPPORT_URL%
The unit @UNIT@ has entered the 'failed' state with result '@UNIT_RESULT@'.
-- 98e322203f7a4ed290d09fe03c09fe15
Subject: Unit process exited
Defined-By: systemd
Support: %SUPPORT_URL%
An @COMMAND@= process belonging to unit @UNIT@ has exited.
The process' exit code is '@EXIT_CODE@' and its exit status is @EXIT_STATUS@.
-- 50876a9db00f4c40bde1a2ad381c3a1b
Subject: The system is configured in a way that might cause problems
Defined-By: systemd

View file

@ -1270,8 +1270,11 @@ static void mount_sigchld_event(Unit *u, pid_t pid, int code, int status) {
m->control_command_id = _MOUNT_EXEC_COMMAND_INVALID;
}
log_unit_full(u, f == MOUNT_SUCCESS ? LOG_DEBUG : LOG_NOTICE, 0,
"Mount process exited, code=%s status=%i", sigchld_code_to_string(code), status);
unit_log_process_exit(
u, f == MOUNT_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
"Mount process",
mount_exec_command_to_string(m->control_command_id),
code, status);
/* Note that due to the io event priority logic, we can be sure the new mountinfo is loaded
* before we process the SIGCHLD for the mount command. */

View file

@ -3233,21 +3233,13 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
/* When this is a successful exit, let's log about the exit code on DEBUG level. If this is a failure
* and the process exited on its own via exit(), then let's make this a NOTICE, under the assumption
* that the service already logged the reason at a higher log level on its own. However, if the service
* died due to a signal, then it most likely didn't say anything about any reason, hence let's raise
* our log level to WARNING then. */
log_struct(f == SERVICE_SUCCESS ? LOG_DEBUG :
(code == CLD_EXITED ? LOG_NOTICE : LOG_WARNING),
LOG_UNIT_MESSAGE(u, "Main process exited, code=%s, status=%i/%s",
sigchld_code_to_string(code), status,
strna(code == CLD_EXITED
? exit_status_to_string(status, EXIT_STATUS_FULL)
: signal_to_string(status))),
"EXIT_CODE=%s", sigchld_code_to_string(code),
"EXIT_STATUS=%i", status,
LOG_UNIT_ID(u),
LOG_UNIT_INVOCATION_ID(u));
* that the service already logged the reason at a higher log level on its own. (Internally,
* unit_log_process_exit() will possibly bump this to WARNING if the service died due to a signal.) */
unit_log_process_exit(
u, f == SERVICE_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
"Main process",
service_exec_command_to_string(SERVICE_EXEC_START),
code, status);
if (s->result == SERVICE_SUCCESS)
s->result = f;
@ -3336,9 +3328,11 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
f = SERVICE_SUCCESS;
}
log_unit_full(u, f == SERVICE_SUCCESS ? LOG_DEBUG : LOG_NOTICE, 0,
"Control process exited, code=%s status=%i",
sigchld_code_to_string(code), status);
unit_log_process_exit(
u, f == SERVICE_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
"Control process",
service_exec_command_to_string(s->control_command_id),
code, status);
if (s->result == SERVICE_SUCCESS)
s->result = f;

View file

@ -2968,9 +2968,11 @@ static void socket_sigchld_event(Unit *u, pid_t pid, int code, int status) {
f = SOCKET_SUCCESS;
}
log_unit_full(u, f == SOCKET_SUCCESS ? LOG_DEBUG : LOG_NOTICE, 0,
"Control process exited, code=%s status=%i",
sigchld_code_to_string(code), status);
unit_log_process_exit(
u, f == SOCKET_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
"Control process",
socket_exec_command_to_string(s->control_command_id),
code, status);
if (s->result == SOCKET_SUCCESS)
s->result = f;

View file

@ -1011,8 +1011,11 @@ static void swap_sigchld_event(Unit *u, pid_t pid, int code, int status) {
s->control_command_id = _SWAP_EXEC_COMMAND_INVALID;
}
log_unit_full(u, f == SWAP_SUCCESS ? LOG_DEBUG : LOG_NOTICE, 0,
"Swap process exited, code=%s status=%i", sigchld_code_to_string(code), status);
unit_log_process_exit(
u, f == SWAP_SUCCESS ? LOG_DEBUG : LOG_NOTICE,
"Swap process",
swap_exec_command_to_string(s->control_command_id),
code, status);
switch (s->state) {

View file

@ -5456,6 +5456,35 @@ void unit_log_failure(Unit *u, const char *result) {
"UNIT_RESULT=%s", result);
}
void unit_log_process_exit(
Unit *u,
int level,
const char *kind,
const char *command,
int code,
int status) {
assert(u);
assert(kind);
if (code != CLD_EXITED)
level = LOG_WARNING;
log_struct(level,
"MESSAGE_ID=" SD_MESSAGE_UNIT_PROCESS_EXIT_STR,
LOG_UNIT_MESSAGE(u, "%s exited, code=%s, status=%i/%s",
kind,
sigchld_code_to_string(code), status,
strna(code == CLD_EXITED
? exit_status_to_string(status, EXIT_STATUS_FULL)
: signal_to_string(status))),
"EXIT_CODE=%s", sigchld_code_to_string(code),
"EXIT_STATUS=%i", status,
"COMMAND=%s", strna(command),
LOG_UNIT_ID(u),
LOG_UNIT_INVOCATION_ID(u));
}
static const char* const collect_mode_table[_COLLECT_MODE_MAX] = {
[COLLECT_INACTIVE] = "inactive",
[COLLECT_INACTIVE_OR_FAILED] = "inactive-or-failed",

View file

@ -807,6 +807,7 @@ const char *unit_label_path(Unit *u);
int unit_pid_attachable(Unit *unit, pid_t pid, sd_bus_error *error);
void unit_log_failure(Unit *u, const char *result);
void unit_log_process_exit(Unit *u, int level, const char *kind, const char *command, int code, int status);
/* Macros which append UNIT= or USER_UNIT= to the message */

View file

@ -113,6 +113,9 @@ _SD_BEGIN_DECLARATIONS;
#define SD_MESSAGE_SPAWN_FAILED SD_ID128_MAKE(64,12,57,65,1c,1b,4e,c9,a8,62,4d,7a,40,a9,e1,e7)
#define SD_MESSAGE_SPAWN_FAILED_STR SD_ID128_MAKE_STR(64,12,57,65,1c,1b,4e,c9,a8,62,4d,7a,40,a9,e1,e7)
#define SD_MESSAGE_UNIT_PROCESS_EXIT SD_ID128_MAKE(98,e3,22,20,3f,7a,4e,d2,90,d0,9f,e0,3c,09,fe,15)
#define SD_MESSAGE_UNIT_PROCESS_EXIT_STR SD_ID128_MAKE_STR(98,e3,22,20,3f,7a,4e,d2,90,d0,9f,e0,3c,09,fe,15)
#define SD_MESSAGE_FORWARD_SYSLOG_MISSED SD_ID128_MAKE(00,27,22,9c,a0,64,41,81,a7,6c,4e,92,45,8a,fa,2e)
#define SD_MESSAGE_FORWARD_SYSLOG_MISSED_STR \
SD_ID128_MAKE_STR(00,27,22,9c,a0,64,41,81,a7,6c,4e,92,45,8a,fa,2e)