1
0
mirror of https://github.com/systemd/systemd.git synced 2024-10-31 07:51:21 +03:00

systemctl: make sure "systemctl -M status" shows cgroup tree of container not host

This shows the cgroup tree of the root slice of the container now, by
querying the cgroup pid tree via the bus instead of going directly to
the cgroupfs.

A fallback is kept for really old systemd versions where querying the
PID tree was not available.

Fixes: #20958
This commit is contained in:
Lennart Poettering 2021-10-28 16:44:29 +02:00
parent 35ac0260db
commit 038cae098b

View File

@ -29,6 +29,7 @@
#include "process-util.h"
#include "signal-util.h"
#include "sort-util.h"
#include "special.h"
#include "string-table.h"
#include "systemctl-list-machines.h"
#include "systemctl-list-units.h"
@ -2043,8 +2044,10 @@ static int show_all(
static int show_system_status(sd_bus *bus) {
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_(machine_info_clear) struct machine_info mi = {};
static const char prefix[] = " ";
_cleanup_free_ char *hn = NULL;
const char *on, *off;
unsigned c;
int r;
hn = gethostname_malloc();
@ -2087,16 +2090,15 @@ static int show_system_status(sd_bus *bus) {
FORMAT_TIMESTAMP_RELATIVE(mi.timestamp));
printf(" CGroup: %s\n", empty_to_root(mi.control_group));
if (IN_SET(arg_transport,
BUS_TRANSPORT_LOCAL,
BUS_TRANSPORT_MACHINE)) {
static const char prefix[] = " ";
unsigned c;
c = LESS_BY(columns(), strlen(prefix));
c = LESS_BY(columns(), strlen(prefix));
r = unit_show_processes(bus, SPECIAL_ROOT_SLICE, mi.control_group, prefix, c, get_output_flags(), &error);
if (r == -EBADR && arg_transport == BUS_TRANSPORT_LOCAL) /* Compatibility for really old systemd versions */
show_cgroup(SYSTEMD_CGROUP_CONTROLLER, strempty(mi.control_group), prefix, c, get_output_flags());
}
else if (r < 0)
log_warning_errno(r, "Failed to dump process list for '%s', ignoring: %s",
arg_host ?: hn, bus_error_message(&error, r));
return 0;
}