如何在不同的、已存在的 systemd 作用域或会话中运行命令?

如何在不同的、已存在的 systemd 作用域或会话中运行命令?

如何在不同的现有 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,,stringarray of unsigned表示传递给函数的参数类型AttachProcessesToUnit,该函数的文档可以在 中找到man:org.freedesktop.systemd1(5)

笔记:

  1. 应设置要连接的单元Delegate=yes(参见man:systemd.resource-control(5)
  2. 要传递 pid 数组,您应该在 pid 之前传递数组的长度(在上面的示例中为 1)。

将其附加到给定范围后,您可以通过systemd-cgls或查看该范围的子进程systemctl --user status app-sleep.scope

相关内容