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
答案1
这每个用户实例systemd 是通过登录进程(PAM)的钩子启动的pam_systemd
,用于普通的虚拟/真实终端登录和通过 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_systemd
方案sudo
。
进一步阅读
- 乔纳森·德博因·波拉德 (2014)。不要滥用 su 来删除用户权限。常见答案。
- 伦纳特·珀特林等人。 (2017)。
pam_systemd
。系统手册页。 Freedesktop.org。
答案2
所以我终于找到了拼图中缺失的那一块。感谢 @JdeBP 的一些出色提示,我能够确定:
- systemd --user 正在为 www-data 运行
- Ubuntu下DBUS_SESSION_BUS_ADRESS似乎被忽略
- 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
答案3
这些都是相当丑陋的解决方法。
正如所说,问题是:
您尚未登录。您正在增强现有登录会话的权限 [...]
因此,“只需”登录...
如果您在服务器上,则需要使用终端。 我不得不问同样的问题,但终于找到了。解决方案非常简单,只需运行此命令切换到您的用户(分别使用该用户运行适当的 shell):
$ sudo machinectl shell --uid www-data
sudo loginctl enable-linger www-data
请注意,如果您打算在那里启动服务等,以便让它们在启动时运行,这仍然很有用。否则,它们只会在该用户“登录”时运行。
答案4
如中所述这里有评论systemctl
,您可能只是缺少允许以用户身份运行的相关 Ubuntu 软件包。刚刚发生在我身上。修理:
apt install libpam-systemd
以应该能够执行的用户身份通过 SSH 重新登录
systemctl --user
。所以,不要以 root 身份。
现在,echo $XDG_RUNTIME_DIR
应该无需进一步的步骤即可工作,显示如下内容:
$ echo $XDG_RUNTIME_DIR
/run/user/1012
Ubuntu 18.04 LTS 在这里。