我使用 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,它作为自己的服务运行)启动的命令在会话范围内运行。我不知道还有其他方法可以在范围内获取进程。另请参阅这。
对我来说,很明显,您有时希望在会话中拥有一个服务(即,如果会话被终止,则将其终止,如果您有多个会话,则拥有多个副本),所以如果不存在,我希望它会建一段时间。