mirror of
https://github.com/systemd/systemd.git
synced 2025-03-19 22:50:17 +03:00
Merge pull request #5502 from poettering/coredump-mini-fixes
Coredump mini improvments
This commit is contained in:
commit
47ef78b27f
@ -695,6 +695,19 @@ static int change_uid_gid(const char *context[]) {
|
||||
return drop_privileges(uid, gid, 0);
|
||||
}
|
||||
|
||||
static bool is_journald_crash(const char *context[_CONTEXT_MAX]) {
|
||||
assert(context);
|
||||
|
||||
return streq_ptr(context[CONTEXT_UNIT], SPECIAL_JOURNALD_SERVICE);
|
||||
}
|
||||
|
||||
static bool is_pid1_crash(const char *context[_CONTEXT_MAX]) {
|
||||
assert(context);
|
||||
|
||||
return streq_ptr(context[CONTEXT_UNIT], SPECIAL_INIT_SCOPE) ||
|
||||
streq_ptr(context[CONTEXT_PID], "1");
|
||||
}
|
||||
|
||||
#define SUBMIT_COREDUMP_FIELDS 4
|
||||
|
||||
static int submit_coredump(
|
||||
@ -715,7 +728,7 @@ static int submit_coredump(
|
||||
assert(n_iovec_allocated >= n_iovec + SUBMIT_COREDUMP_FIELDS);
|
||||
assert(input_fd >= 0);
|
||||
|
||||
journald_crash = streq_ptr(context[CONTEXT_UNIT], SPECIAL_JOURNALD_SERVICE);
|
||||
journald_crash = is_journald_crash(context);
|
||||
|
||||
/* Vacuum before we write anything again */
|
||||
(void) coredump_vacuum(-1, arg_keep_free, arg_max_use);
|
||||
@ -795,7 +808,7 @@ log:
|
||||
IOVEC_SET_STRING(iovec[n_iovec++], core_message);
|
||||
|
||||
if (truncated)
|
||||
IOVEC_SET_STRING(iovec[n_iovec++], "COREDUMP_TRUNCATED=yes");
|
||||
IOVEC_SET_STRING(iovec[n_iovec++], "COREDUMP_TRUNCATED=1");
|
||||
|
||||
/* Optionally store the entire coredump in the journal */
|
||||
if (arg_storage == COREDUMP_STORAGE_JOURNAL) {
|
||||
@ -1103,14 +1116,14 @@ static int gather_pid_metadata(
|
||||
log_warning_errno(r, "Failed to get EXE, ignoring: %m");
|
||||
|
||||
if (cg_pid_get_unit(pid, &context[CONTEXT_UNIT]) >= 0) {
|
||||
if (!streq(context[CONTEXT_UNIT], SPECIAL_JOURNALD_SERVICE)) {
|
||||
if (!is_journald_crash((const char**) context)) {
|
||||
/* OK, now we know it's not the journal, hence we can make use of it now. */
|
||||
log_set_target(LOG_TARGET_JOURNAL_OR_KMSG);
|
||||
log_open();
|
||||
}
|
||||
|
||||
/* If this is PID 1 disable coredump collection, we'll unlikely be able to process it later on. */
|
||||
if (streq(context[CONTEXT_UNIT], SPECIAL_INIT_SCOPE)) {
|
||||
if (is_pid1_crash((const char**) context)) {
|
||||
log_notice("Due to PID 1 having crashed coredump collection will now be turned off.");
|
||||
(void) write_string_file("/proc/sys/kernel/core_pattern", "|/bin/false", 0);
|
||||
}
|
||||
@ -1248,9 +1261,7 @@ static int process_kernel(int argc, char* argv[]) {
|
||||
|
||||
assert(n_iovec <= ELEMENTSOF(iovec));
|
||||
|
||||
if (STRPTR_IN_SET(context[CONTEXT_UNIT],
|
||||
SPECIAL_JOURNALD_SERVICE,
|
||||
SPECIAL_INIT_SCOPE))
|
||||
if (is_journald_crash((const char**) context) || is_pid1_crash((const char**) context))
|
||||
r = submit_coredump((const char**) context,
|
||||
iovec, ELEMENTSOF(iovec), n_iovec,
|
||||
STDIN_FILENO);
|
||||
|
@ -51,6 +51,8 @@
|
||||
#include "user-util.h"
|
||||
#include "util.h"
|
||||
|
||||
#define SHORT_BUS_CALL_TIMEOUT_USEC (3 * USEC_PER_SEC)
|
||||
|
||||
static usec_t arg_since = USEC_INFINITY, arg_until = USEC_INFINITY;
|
||||
|
||||
static enum {
|
||||
@ -414,7 +416,7 @@ static int print_list(FILE* file, sd_journal *j, int had_legend) {
|
||||
else
|
||||
present = "-";
|
||||
|
||||
if (STR_IN_SET(present, "present", "journal") && streq_ptr(truncated, "yes"))
|
||||
if (STR_IN_SET(present, "present", "journal") && truncated && parse_boolean(truncated) > 0)
|
||||
present = "truncated";
|
||||
|
||||
fprintf(file, "%-*s %*s %*s %*s %*s %-*s %s\n",
|
||||
@ -583,8 +585,10 @@ static int print_info(FILE *file, sd_journal *j, bool need_space) {
|
||||
fprintf(file, " Hostname: %s\n", hostname);
|
||||
|
||||
if (filename) {
|
||||
bool inacc = access(filename, R_OK) < 0;
|
||||
bool trunc = streq_ptr(truncated, "yes");
|
||||
bool inacc, trunc;
|
||||
|
||||
inacc = access(filename, R_OK) < 0;
|
||||
trunc = truncated && parse_boolean(truncated) > 0;
|
||||
|
||||
if (inacc || trunc)
|
||||
fprintf(file, " Storage: %s%s (%s%s%s)%s\n",
|
||||
@ -990,7 +994,7 @@ static int check_units_active(void) {
|
||||
if (r < 0)
|
||||
return bus_log_create_error(r);
|
||||
|
||||
r = sd_bus_call(bus, m, 3 * USEC_PER_SEC, &error, &reply);
|
||||
r = sd_bus_call(bus, m, SHORT_BUS_CALL_TIMEOUT_USEC, &error, &reply);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to check if any systemd-coredump@.service units are running: %s",
|
||||
bus_error_message(&error, r));
|
||||
|
Loading…
x
Reference in New Issue
Block a user