systemd-cgls 是 systemd 提供的用于以树状结构展示 cgroup 层级关系的命令行工具,可直观呈现 slice、service、scope 等 unit 的嵌套结构及对应进程 PID,并支持按路径过滤(如 system.slice)、--all 显示空 unit、--no-pager 适配脚本等选项。

systemd-cgls 是 systemd 提供的用于查看 cgroup 层级结构的命令行工具,它能以树状形式展示当前系统中所有由 systemd 管理的控制组(cgroups)及其服务、scope、slice 的嵌套关系,直观反映资源分配层级。默认情况下,它显示的是 /sys/fs/cgroup 下 systemd 所管理的 cgroup v2(或 v1 兼容模式)视图。
基础用法:查看默认 systemd 资源树
直接运行以下命令即可输出当前 systemd 管理的完整 cgroup 树:
systemd-cgls
输出从根 slice(-.slice)开始,逐级展开所有子 slice(如 system.slice、user.slice、machine.slice),再列出其中包含的 service、scope 或 transient unit。每个 unit 名称后会标注其对应进程 PID(如果正在运行)。
按资源类型过滤查看特定 cgroup 子树
可通过指定路径只显示某一级 slice 或 unit 下的子树,便于聚焦分析:
- 查看所有系统服务:
systemd-cgls system.slice - 查看当前用户会话下的进程:
systemd-cgls user.slice - 查看某个具体服务(如 ssh):
systemd-cgls system-sshd.slice或systemd-cgls /system.slice/sshd.service
注意:路径需与 cgroup 文件系统中的实际挂载路径一致,通常可省略 /sys/fs/cgroup/ 前缀;支持 tab 补全(需 bash/zsh 补全支持)。
结合其他选项增强可读性与调试能力
常用实用选项包括:
-
--all:显示所有 cgroup,包括空的或未激活的 unit(默认仅显示有进程的) -
--no-pager:禁用分页器,适合管道处理或脚本调用 -
--depth=N:限制输出深度(例如--depth=3只显示前三层) -
--recursive:强制递归展开(对某些惰性挂载的 cgroup 更可靠)
例如,要完整查看含空 unit 的系统资源树并防止分页干扰,可运行:
systemd-cgls --all --no-pager
验证 cgroup 版本与挂载点是否就绪
若 systemd-cgls 报错(如 “No such file or directory” 或输出为空),请确认:
- cgroup v2 是否已启用:检查
/proc/filesystems中是否有cgroup2,或运行stat /sys/fs/cgroup | grep Type,应显示Type: cgroup2 - systemd 是否以 cgroup v2 模式启动:确认内核启动参数含
systemd.unified_cgroup_hierarchy=1(现代发行版如 Fedora/RHEL 9+/Ubuntu 22.04+ 默认启用) - 必要内核配置已开启:
CONFIG_CGROUPS=y、CONFIG_CGROUP_V2=y等
若系统仍使用 cgroup v1,systemd-cgls 仍可工作,但树形结构可能混合 legacy controller(如 cpu、memory 分离),此时建议优先迁移到 v2 以获得统一视图。


















