管理另一个用户的 systemd 单元

管理另一个用户的 systemd 单元

一个用户(或者可能是 root)可以控制另一个用户的用户级 systemd 服务吗?

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

答案1

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

export XDG_RUNTIME_DIR="/run/user/$UID"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"

如果这有帮助,您可以将这些命令放入 .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

或使用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

答案2

系统248-M username@(2021 年 3 月发布)引入了对指定另一个用户的语法的支持。

假设另一个用户名是测试用户服务是foob​​ar.service,你现在可以运行

sudo systemctl -M testuser@ --user restart foobar.service

答案3

假设someuser用途巴什作为他们的登录 shell,添加以下内容出口~someuser/.bashrc

export XDG_RUNTIME_DIR="/run/user/$UID"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"

然后,具有root/的用户须藤权限可以someuser通过用以下命令包装命令来与 systemd交互runuser

sudo runuser -l someuser -c "systemctl --user restart some-template@$some-service.service"

答案4

Failed to connect to bus: No such file or directory在 Ubuntu 20.04 上运行以下命令时,我遇到了同样的错误 ( ):

systemctl --user mask tracker-store.service tracker-miner-fs.service tracker-miner-rss.service tracker-extract.service tracker-miner-apps.service tracker-writeback.service

问题是由于别名造成的:

alias systemctl='sudo systemctl'

它替换systemctlsudo systemctlsudo 导致了错误。

环境变量:

export XDG_RUNTIME_DIR="/run/user/$UID"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"

没有使用,因为sudo.

mkaito写在上面的评论:

我猜 sudo 需要那些白名单,因为它默认清除环境。

相关内容