我正在使用带有 MATE 桌面的 Ubuntu 20.04 LTS,它本身不支持在与其他应用程序不同的 cgroup 中启动桌面 UI 和窗口管理器。
是否可以通过创建嵌套的子进程并将选定的进程移动到那里来运行一些systemd
特定命令?我更喜欢不需要或的东西,以便相应的用户帐户(使用有效用户 ID )可以安全地执行所需的命令。.xsessionrc
cgroup
user@${UID}.service
sudo
root
$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 并移动进程挂载的 sysfs或cgclassify
。以下是示例:
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 之间的控制器是不同的。