如何在会话范围内启动服务(或目标)?

如何在会话范围内启动服务(或目标)?

我使用 systemd 启动桌面会话的大部分进程:xmonad(窗口管理器)、emacs 守护进程、tmux 会话等。

列出我的用户进程,loginctl user-status因此仅显示会话下的少数进程:

  Unit: user-1000.slice
        ├─session-5.scope
        │ ├─4740 lightdm --session-child 13 16
        │ ├─5047 systemctl --user --wait start xmonad-systemd-session.target
        │ └─5497 /usr/bin/ssh-agent /usr/bin/im-launch xmonad-systemd-session
        └─[email protected]

我的几乎所有进程都在下面的会话之外运行[email protected]。这意味着loginctl session-status从 tmux 运行会给出:

Could not get properties: Caller does not belong to any known session

我想告诉 systemd 在特定的登录会话下启动某些服务。理想情况下,在我的会话启动脚本中我会编写:

exec systemctl --user --wait \
    --scope $MY_DESKTOP_SESSION start xmonad-systemd-session.target

但是没有--scope选择,我也不知道如何获取范围名称。

我在 Debian-ish(内部)发行版上使用 libpam-systemd 和 dbus-user-session 运行 systemd 240。

答案1

我不确定 systemd 是否允许在已包含进程的范围内提供服务。根据控制组接口文档一个范围或服务不能同时拥有流程和其他范围/服务作为子项。 (或者实际上它说切片仅包含服务和范围,而服务和范围包含进程。但是我的系统似乎没有遵循这些文档,因为我的系统中有服务[电子邮件受保护].)

您可以通过让进程从会话中已有的某个东西启动,在会话范围内运行进程。在 Gnome 中,从 Alt+F2 或例如 xterm(但不是 gnome-termal,它作为自己的服务运行)启动的命令在会话范围内运行。我不知道还有其他方法可以在范围内获取进程。另请参阅

对我来说,很明显,您有时希望在会话中拥有一个服务(即,如果会话被终止,则将其终止,如果您有多个会话,则拥有多个副本),所以如果不存在,我希望它会建一段时间。

相关内容