我需要 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 用户单元。我怎样才能做到这一点?
不要使用
su
orsudo
,而是使用machinectl
它会为您提供适当的用户会话和上下文。您可以像以前那样从
su
/中放入一个外壳sudo
:…并在给定用户的上下文中执行您想要执行的任何操作,或者您可以将要执行的 cmd 作为附加参数传递,例如:
确保不要将 $(which bash) -c 嵌套在引号中。
我实际上想出了一种非常干净的方法,它不涉及让用户实际登录。需要为 root 用户启用带有 loginctl 的 linger。
loginctl enable-linger user1
然后你可以检查状态
loginctl user-status user1
这应该列出用户从他们的 systemd 进程运行的所有进程。现在我可以在没有用户实际登录的情况下以 root 身份运行:
runuser -l user1 -c 'systemctl --user status myunit.service'