进一步阅读

进一步阅读

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-datasystemd 的每用户实例尚未启动,并且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

进一步阅读

答案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 软件包。刚刚发生在我身上。修理:

  1. apt install libpam-systemd

  2. 以应该能够执行的用户身份通过​​ SSH 重新登录systemctl --user。所以,不要以 root 身份。

现在,echo $XDG_RUNTIME_DIR应该无需进一步的步骤即可工作,显示如下内容:

$ echo $XDG_RUNTIME_DIR
/run/user/1012

Ubuntu 18.04 LTS 在这里。

相关内容