![如何在不同的、已存在的 systemd 作用域或会话中运行命令?](https://linux22.com/image/175837/%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%8D%E5%90%8C%E7%9A%84%E3%80%81%E5%B7%B2%E5%AD%98%E5%9C%A8%E7%9A%84%20systemd%20%E4%BD%9C%E7%94%A8%E5%9F%9F%E6%88%96%E4%BC%9A%E8%AF%9D%E4%B8%AD%E8%BF%90%E8%A1%8C%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
如何在不同的现有 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
。