如何使用 systemd 将已经运行的进程移动到不同的“cgroup”?

如何使用 systemd 将已经运行的进程移动到不同的“cgroup”?

我正在使用带有 MATE 桌面的 Ubuntu 20.04 LTS,它本身不支持在与其他应用程序不同的 cgroup 中启动桌面 UI 和窗口管理器。

是否可以通过创建嵌套的子进程并将选定的进程移动到那里来运行一些systemd特定命令?我更喜欢不需要或的东西,以便相应的用户帐户(使用有效用户 ID )可以安全地执行所需的命令。.xsessionrccgroupuser@${UID}.servicesudoroot$UID

基本上,我正在寻找现实世界中遵循假想命令的替代品

systemd-cgroup-create --parent "user@${UID}.service" "gui-desktop@${UID}.slice"
systemd-cgroup-move-process --to "gui-desktop@${UID}.slice" $(pgrep --uid $UID marco) $(pgrep --uid $UID mate-panel) $(pgrep --uid $UID mate-session)
systemd-cgroup-modify --set "MemoryMin=1G" --set "IOWeight=1000" "gui-desktop@${UID}.slice"

我所能看到的是,systemd-run但它只支持启动单个进程,而不是操作已经存在的进程。

我知道,cgclassify类似的旧工具在技术上可以通过给定的root访问权限做到这一点,但systemd认为它是修改 cgroup 层次结构的唯一来源,因此这需要通过systemd特定的命令来完成。

答案1

systemd 认为它是 cgroup 层次结构修改的唯一来源,因此这需要通过 systemd 特定的命令来完成。

这不一定是真的:systemd 允许其他参与者通过使用Delegate=true。在该 cgroup 中,你可以使用 创建新的 cgroup 并移动进程挂载的 sysfscgclassify。以下是示例:

systemd-run --scope --user --shell --property=Delegate=true
cg=$(awk -F: '{print $3}' /proc/self/cgroup)

7za b &>/dev/null & # just some load

pid=$!

cgcreate -g :$cg/mysubgroup
cgclassify -g :$cg/mysubgroup $pid

# equivalent
#mkdir /sys/fs/cgroup/$cg/mysubgroup
#echo $pid > $_/cgroup.procs

jobs -p | xargs kill # cleanup

请记住,cgroups v1 和 v2 之间的控制器是不同的。

相关内容