如何在不同的现有 systemd 会话或范围中运行命令?
据我所知,就进程在其中一个或另一个而言,会话和会话的范围单元之间没有区别。
出现这个问题是因为在 Gnome 中,从终端运行的命令被视为 的一部分gnome-terminal-server.service
,而不是session-xx.scope
.如果我想在我的会话中(或在另一个会话中)运行命令,我该怎么做?
(注意:这是相反的这问题,要求围绕现有流程创建新的范围。)
答案1
@伽玛函数指向正确的方向,我成功地使用以下命令:
$ systemd-run --user --scope --unit="app-sleep" --property=Delegate=yes sleep 9999 &
$ disown
$ sleep 8888 &
$ pid=$(jobs -p)
$ busctl --user call org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager AttachProcessesToUnit ssau "app-sleep.scope" / 1 "$pid"
这里的ssau
(我认为它的意思是string
,,string
)array of unsigned
表示传递给函数的参数类型AttachProcessesToUnit
,该函数的文档可以在 中找到man:org.freedesktop.systemd1(5)
。
笔记:
- 应设置要连接的单元
Delegate=yes
(参见man:systemd.resource-control(5)
) - 要传递 pid 数组,您应该在 pid 之前传递数组的长度(在上面的示例中为 1)。
将其附加到给定范围后,您可以通过systemd-cgls
或查看该范围的子进程systemctl --user status app-sleep.scope
。