systemctl --user 不适用于 www-data 用户

Jon*_*eig 8 systemd not-root-user

systemctl --user 对于桌面用户来说似乎工作正常:

dev@dev-VirtualBox:~$ systemctl --user > /dev/null
dev@dev-VirtualBox:~$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

但是当在 www-data 用户下运行相同的命令时,我得到了一个意外的响应

dev@dev-VirtualBox:~$ sudo su www-data -s /bin/bash
www-data@dev-VirtualBox:~$ systemctl --user > /dev/null 
Failed to connect to bus: No such file or directory 
www-data@dev-VirtualBox:~$ echo $? 
1
Run Code Online (Sandbox Code Playgroud)

systemctl --user这里怎么启用?

运行 Ubuntu 16.04

Jde*_*eBP 12

systemd的每个用户实例由登录过程的钩子启动,一个pam_systemdPAM,用于普通的虚拟/真实终端登录和通过 SSH 和其他方式的远程登录。

您还没有登录。 您增强的特权您现有的登录会话使用sudo su www-data。(顺便说一下,这是多余的。 无需您以超级用户身份运行命令sudo -u www-data即可直接www-data运行。)您还没有调用钩子。

因此www-data, systemd 的每个用户实例尚未启动,并且systemctl --user找不到任何可交谈的内容。

您可以手动启动它:

% sudo install -d -o www-data /run/user/`id -u www-data`
% sudo systemctl start user@`id -u www-data`

(如果你以错误的顺序做了这些,那么停止服务并以正确的顺序进行。以错误的顺序执行它们最终会导致运行时目录为空并且缺少 D-Bus 和其他套接字文件的状态,但服务正在运行并且永远不会与客户端通信。)

一个小问题是您的DBUS_SESSION_BUS_ADDRESS变量需要更改,以便桌面总线客户端程序systemctl在您使用另一个帐户的权限运行它们时与另一个帐户的桌面总线代理对话:

% sudo -u www-data DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/`id -u www-data`/bus systemctl --user

这是简单的方法。更复杂的方法是调整 PAM 配置以便sudo调用pam_systemd钩子。但是,这会产生副作用,尤其是在XDG_RUNTIME_DIR环境变量方面,您可能不希望出现这种情况。只有当你有信心,你好吗与引入的效果尝试这种替代pam_systemdsudo

进一步阅读


Jon*_*eig 6

所以我终于能够找出拼图的缺失部分。多亏了@JdeBP 的一些出色提示,我才能确定:

  • systemd --user 正在为 www-data 运行
  • DBUS_SESSION_BUS_ADRESS 在 Ubuntu 下好像被忽略了
  • XDG_RUNTIME_DIR 未设置

将 XDG_RUNTIME_DIR 设置为导出“/run/user/$UID”解决了我的问题

我遵循的步骤以获得预期的行为:

% sudo loginctl enable-linger www-data # Enable systemd --user service to start at boot
% XDG_RUNTIME_DIR="/run/user/$UID" systemctl --user # Access services as www-data without actually logging in
Run Code Online (Sandbox Code Playgroud)