管理另一个用户的 systemd 单元

mka*_*ito 12 sudo systemd

一个用户或 root 用户可以控制另一个用户的用户级 systemd 服务吗?

我试过了sudo -u <some user> systemctl --user restart <some service>,但它抱怨 dbus: Failed to get D-Bus connection: Connection refused

Tha*_*awn 8

当我通过 ssh 远程登录到我的 gentoo box 时,我遇到了同样的问题。就我而言,这是因为缺少XDG_RUNTIME_DIRDBUS_SESSION_BUS_ADDRESS环境变量。运行以下命令并重试:

export XDG_RUNTIME_DIR="/run/user/$UID"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
Run Code Online (Sandbox Code Playgroud)

如果这有帮助,您可以将这些命令放入 .bashrc。我想肯定有比 .bashrc 更优雅的解决方案,但这取决于您的发行版。

这是我找到解决方案的地方。

编辑:

以 root 身份登录,我设法以systemctl --user另一个用户su身份成功运行,如下所示:

su -c 'XDG_RUNTIME_DIR="/run/user/$UID" DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus" systemctl --user status' username
Run Code Online (Sandbox Code Playgroud)

或使用sudo(注意,我必须明确地将相应的用户 UID(1000)添加到路径“/run/user/”,但如果您从 bash 脚本运行它,则可以改用 $SUDO_UID):

sudo -u username XDG_RUNTIME_DIR="/run/user/1000" DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus" systemctl --user status
Run Code Online (Sandbox Code Playgroud)

  • 我在`/etc/profile.d/dbus.sh`中就有这个。我猜想`sudo`需要那些白名单,因为它默认清除环境。不过,我不确定它是否只会传输当前用户的运行时目录。 (2认同)