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


20

我刚刚在arch-linux系统(2012.09.07)上完成了systemd的安装和设置过程。我卸载了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

UPDATE#1

阅读完这里此处的手册页后,我了解systemd的工作原理要好一些。特别是,使用User=WorkingDirectory=选项允许在用户会话中启动服务。然而,问题仍然是用户本身不能startstopenable,或disable服务。一个访问被拒绝错误由下式给出systemctl

UPDATE#2

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

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

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"

其中USERUID必须是给定用户的UID。


我意识到可以为每个用户创建一个单独的服务文件,然后简单地启用它。但是我只想知道我上面描述的方式是否可能。
汉斯

公平的说,我可以sudo为用户进行简单设置,并让他们控制自己的服务文件,如我上面的评论中所述。但是,该解决方案还允许用户控制大多数其他服务……
Hans

如果您已阅读sudo的文档,则不会— sudoers(5)上有许多限制命令参数的示例。
grawity 2012年

Answers:


19

systemd通常不允许普通用户启动系统服务。尽管它确实支持通过polkit授予访问权限,但是仍然缺少该部分,您还不能仅允许一项特定服务。

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

登录时,系统将为您启动一个user@<uid>.service系统单元,这将启动一个单独的systemd的“ --user”实例。新的用户,systemd将读取单元文件(以出发default.target自)~/.config/systemd/user//etc/systemd/user//usr/lib/systemd/user/


1
谢谢,这基本上就是我所缺少的。但是,事实也证明这也是DBus的问题:dbuse中似乎存在一个错误,该错误没有DBUS_SESSION_BUS_ADDRESS为给定的用户设置正确的全局变量 ,因此systemctl无法访问用户会话,这会出错。一旦我弄清楚了这个小问题,其他所有东西都可以正常工作!
汉斯2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.