以 root 身份运行 systemctl --user 命令

以 root 身份运行 systemctl --user 命令

我需要 root 才能管理systemctl --user单位。

现在我已经user1设置了 systemd 用户单元。如果用户直接通过终端、GUI 或 SSH 登录,则可以运行所有systemctl --user命令。

当用户仍然登录时,我可以以 root 身份运行以下命令并systemctl --user在该用户上执行所有命令,没有任何问题:

su - user1 -c "systemctl --user status myunit.service"

但是,如果用户注销,则任何人都无法systemctl --user以该用户身份运行命令,甚至 root 也不能​​。我会继续得到

Failed to connect to bus: No such file or directory

即使我sudo - user1作为root,那也不够好,也会得到同样的错误。用户实际上需要登录才能管理该用户的单位。

显然这是一个已知的“问题”(当系统按设计运行时引用)。

笔记:我尝试在s中设置XDG_RUNTIME_DIR环境变量,但这没有帮助。user1bashrc

另一位用户似乎找到了解决方法,但不起作用。看来开发商不认可他的主意

我发现的唯一解决方法是通过 ssh 进入用户帐户,在使用公钥进行身份验证后运行如下命令:

ssh user1@localhost -f 'systemctl --user status myunit.service'

我正在寻找一种不需要 SSH 连接的解决方法。当用户未登录时,我需要 root 才能管理 systemd 用户单元。我该如何实现这一点?

答案1

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

$ sudo systemctl --user -M user1@ status myunit.service

参考:文件中列出的新功能消息

(此解决方案无需运行loginctl enable-linger user1即可工作)

答案2

不要使用suor sudo,而是使用它machinectl,这将为您提供正确的用户会话和上下文。

您可以直接放入 shell,就像您习惯的 from su/一样sudo

machinectl shell [email protected]

…并在给定用户的上下文中执行您想要执行的任何操作,或者您可以传递要执行的 cmd 作为附加参数,例如:

machinectl shell [email protected] $(which bash) -c "systemctl --user status myunit.service"

确保不要将 $(which bash) -c 嵌套在引号中。

答案3

实际上,我想出了一种非常干净的方法来执行此操作,该方法不涉及用户实际登录。需要使用 loginctl 为 root 用户启用 linger。

loginctl enable-linger user1

然后你可以检查状态

loginctl user-status user1

这应该列出用户从其 systemd 进程运行的所有进程。现在我可以以 root 身份运行,而无需用户实际登录:

runuser -l user1 -c 'systemctl --user status myunit.service'

相关内容