如何设置用户自动启动并正确配置 systemd 用户服务?

Qua*_*hey 1 users arch-linux systemd systemd-unit

在我的 Arch 服务器上,我设置的用户仅限于他们的主目录。我跑了:

useradd -m -s /bin/bash usernamepasswd username

我读过这篇维基文章...

我想我应该使用 systemd 用户服务让每个用户在启动时运行一个节点服务器。所以我登录了一个用户帐户su username并创建了一个~/.config/systemd/user/serve.service包含以下内容的文件:

[Unit]
Description=One of the servers

[Service]
ExecStart=/usr/bin/node /home/username/server.js

[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)

然后我跑systemctl --user enable serve.service了响应Failed to connect to bus: Permission denied

据我所知,我应该systemctl --user ...以用户身份而不是 root 身份运行命令。

那么我在这个配置中错过了什么?

Jde*_*eBP 6

所以我登录了一个用户帐户 su username

不,你没有。

您还没有登录。 您增强的特权您现有的登录会话使用su username

systemctl使用该--user选项定位您的每用户桌面总线,由您的每用户桌面总线守护程序管理,并通过该总线与systemd管理您的每用户服务的每用户实例进行通信。

su不是登录机制。它在现有的交互式登录会话中工作。在该会话中,您的进程具有环境变量,这些变量告诉它们您的每用户运行时目录XDG_RUNTIME_DIR在哪里( )、每用户桌面总线在哪里 ( DBUS_SESSION_BUS_ADDRESS),以及其他诸如 X 服务器在哪里 ( DISPLAY) 的内容。

特别是,DBUS_SESSION_BUS_ADDRESS可以隐式引用XDG_RUNTIME_DIR或可以显式命名相同的路径。该路径通常类似于/run/user/1001/bus桌面总线代理的访问套接字(例如,假设您的用户 ID 为 1001)。

这些变量不会被 改变su。在这方面已经有很多年了,包括其他类似命令的行为,例如pkexec.

这样做的结果是,如果您su在登录会话中使用第二个用户,以第二个用户身份运行systemctl,则尝试连接到位于第一个用户私有目录中的桌面总线代理访问套接字。用户 1002(例如,为您的第二个用户选择用户 ID)无法访问/run/user/1001或其中的任何内容,即使 xe 对该目录具有读取+执行访问权限,xe 也无法访问,/run/user/1001/bus因为这也仅授予用户 1001 访问权限。

当然,这不是首先要与之交谈的合适的桌面总线代理。您想与第二个用户的桌面总线代理交谈,并通过它与第二个用户的systemd.

简单的解决方案是su将这些环境变量设置为适合第二个用户帐户的环境变量,指向第二个用户的桌面总线:

DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1002/bus su 用户名 -c 'systemctl --user'

在这种情况下,我当然会使用一个方便的工具来设置它userenv,这使我不必手动输入该总线地址:

su 用户名 -c 'userenv --set-dbus systemctl --user'

进一步阅读