mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-03-08 20:58:20 +03:00
journald: correctly attribute log messages also with cgroupsv1
With cgroupsv1 a zombie process is migrated to root cgroup in all
hierarchies. This was changed for unified hierarchy and /proc/PID/cgroup
reports cgroup to which process belonged before it exited.
Be more suspicious about cgroup path reported by the kernel and use
unit_id provided by the log client if the kernel reports that process is
running in the root cgroup.
Users tend to care the most about 'log->unit_id' mapping so systemctl
status can correctly report last log lines. Also we wouldn't be able to
infer anything useful from "/" path anyway.
See: 2e91fa7f6d
This commit is contained in:
parent
a9238f6a33
commit
672773b63a
@ -14,6 +14,7 @@
|
||||
#include "journal-util.h"
|
||||
#include "journald-context.h"
|
||||
#include "parse-util.h"
|
||||
#include "path-util.h"
|
||||
#include "process-util.h"
|
||||
#include "string-util.h"
|
||||
#include "syslog-util.h"
|
||||
@ -252,9 +253,11 @@ static int client_context_read_cgroup(Server *s, ClientContext *c, const char *u
|
||||
|
||||
/* Try to acquire the current cgroup path */
|
||||
r = cg_pid_get_path_shifted(c->pid, s->cgroup_root, &t);
|
||||
if (r < 0) {
|
||||
if (r < 0 || empty_or_root(t)) {
|
||||
|
||||
/* If that didn't work, we use the unit ID passed in as fallback, if we have nothing cached yet */
|
||||
/* We use the unit ID passed in as fallback if we have nothing cached yet and cg_pid_get_path_shifted()
|
||||
* failed or process is running in a root cgroup. Zombie processes are automatically migrated to root cgroup
|
||||
* on cgroupsv1 and we want to be able to map log messages from them too. */
|
||||
if (unit_id && !c->unit) {
|
||||
c->unit = strdup(unit_id);
|
||||
if (c->unit)
|
||||
|
Loading…
x
Reference in New Issue
Block a user