systemctl --user
对于桌面用户来说似乎工作正常:
dev@dev-VirtualBox:~$ systemctl --user > /dev/null
dev@dev-VirtualBox:~$ echo $?
0
但是在 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
如何在systemctl --user
这里启用?
运行 Ubuntu 16.04
systemd的每用户实例由登录进程(
pam_systemd
PAM)的钩子启动,用于普通的虚拟/真实终端登录和通过 SSH 或其他方式进行的远程登录。您没有登录。 您正在使用 增加现有登录会话的权限
sudo su www-data
。(顺便说一句,这是多余的。 无需您以超级用户身份运行命令sudo -u www-data
即可直接进入www-data
。)您还没有调用钩子。因此
www-data
, systemd 的每用户实例尚未启动,并且systemctl --user
找不到可与之交谈的内容。您可以手动启动它:
(如果您以错误的顺序执行这些操作,则停止服务并以正确的顺序执行它们。以错误的顺序执行它们最终会导致运行时目录为空且缺少 D-Bus 和其他套接字文件的状态,但服务正在运行,永远不会与客户端通信。)
一个小问题是您的
DBUS_SESSION_BUS_ADDRESS
变量需要更改,以便桌面总线客户端程序systemctl
在您以其他帐户的权限运行它们时与其他帐户的桌面总线代理进行对话:这是简单的方法。更复杂的方法是调整 PAM 配置以便
sudo
调用pam_systemd
钩子。但是,这会产生副作用,尤其是在XDG_RUNTIME_DIR
环境变量方面,这是您可能不希望的。仅当您确信自己对pam_systemd
引入sudo
.进一步阅读
pam_systemd
. systemd 手册页。自由桌面.org。所以我终于能够找出拼图中缺失的部分。感谢@JdeBP 的一些出色提示,我能够确定:
将 XDG_RUNTIME_DIR 设置为导出“/run/user/$UID”解决了我的问题
我遵循的步骤来获得预期的行为:
这些都是非常丑陋的解决方法。
如前所述,问题是:
因此,“只是”登录......
如果您在服务器上,则需要使用终端。 我不得不问同样的问题,但终于可以找到它。该解决方案就像运行此命令以切换到您的用户一样简单(分别与该用户运行适当的 shell):
请注意,
sudo loginctl enable-linger www-data
如果您打算在那里启动服务,那么它仍然很有用,以便让它们在启动时运行。否则,它们只会在该用户的“登录”时运行。正如此处的评论中所述,您可能只是缺少允许
systemctl
以用户身份运行的相关 Ubuntu 软件包。刚刚发生在我身上。修理:apt install libpam-systemd
以应该能够执行的用户身份通过 SSH 重新登录
systemctl --user
。所以,不是作为根。现在,
echo $XDG_RUNTIME_DIR
应该无需进一步步骤即可工作,显示如下:Ubuntu 18.04 LTS 在这里。