如何设置 systemd 服务以由非 root 用户作为用户守护程序启动?

如何设置 systemd 服务以由非 root 用户作为用户守护程序启动?

我刚刚在 arch-linux 系统上完成了 systemd 的安装和设置过程(2012.09.07)。我卸载了initscripts(并删除了配置文件)。

我想要做的是创建一个可以由非 root 用户启动和停止的服务。该服务将启动一个运行 rtorrent 的独立屏幕会话。但是我希望系统上已将此服务设置为启动(启用)的每个用户都为他们专门启动一个特定实例。如何做到这一点?

我记得读过 systemd 支持服务的用户实例,但是我无法找到有关如何设置它的任何信息,或者它是否与我正在寻找的内容有关。

我用于系统的服务文件:

[Unit]
Description=rTorrent

[Service]
Type=forking
ExecStart=/usr/bin/screen -d -m -S rtorrent /usr/bin/rtorrent
ExecStop=/usr/bin/killall -w -s 2 /usr/bin/rtorrent

更新#1

阅读手册页后这里这里,我更了解 systemd 的工作原理。具体来说,使用User=WorkingDirectory=选项允许在用户会话中启动服务。然而,问题仍然存在,用户自己无法启动、、start或服务。stopenabledisable访问被拒绝误差由给出systemctl

更新#2

首先,为了简化并更好地使用 systemd 的用户会话功能(仍然有些不完整),我使用sofar 的用户会话单元并遵循他的配置建议。

当前版本的 DBus(1.6.4-1)似乎存在一个错误,它没有设置环境变量,这DBUS_SESSION_BUS_ADDRESS意味着使用systemctl --user命令会出现错误:

Failed to get D-Bus connection: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11

该变量应如下所示:

DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/USERUID/dbus/user_bus_socket"

在哪里用户ID需要是给定用户的 UID。

答案1

systemd 通常不允许普通用户启动系统服务。虽然它确实支持通过 polkit 授予访问权限,但这部分仍然有些不足,而且您还不能只允许一项特定服务。

(编辑:更高版本的 systemd 确实支持它,但仅限于 polkit v106 或更高版本。)

由于 rtorrent 实际上不是一个系统服务,并且因为您希望每个用户都有自己的 rtorrent 实例,因此请尝试使用 systemd 的“用户”模式。

当您登录时,系统将为user@<uid>.service您启动一个系统单元,它将启动一个单独的 systemd“--user”实例。新的 user-systemd将从、和读取单元文件(以 开头default.target)。~/.config/systemd/user//etc/systemd/user//usr/lib/systemd/user/

相关内容