我需要 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
环境变量,但这没有帮助。user1
bashrc
另一位用户似乎找到了解决方法,但不起作用。看来开发商不认可他的主意。
我发现的唯一解决方法是通过 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
不要使用su
or 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'