我可以想到两种方法:
一种是通过使服务成为用户服务而不是系统服务。
代替创建系统单元,将systemd单元放置在服务用户的主目录下$HOME/.config/systemd/user/daemon-name.service
。然后同一个用户可以管理服务与systemctl --user <action> daemon-name.service
。
为了允许用户单元在启动时启动,root用户必须为该帐户启用linger,即sudo loginctl enable-linger username
。单位也必须是WantedBy=default.target
。
另一种方法是允许用户访问通过PolicyKit管理系统单元。这需要systemd 226或更高版本(对于JavaScript Rules.d文件,PolicyKit> = 0.106 –选中pkaction --version
)。
您将创建一个新的PolicyKit配置文件,例如/etc/polkit-1/rules.d/57-manage-daemon-name.rules
,该文件检查您要允许的属性。对于例如:
// Allow alice to manage example.service;
// fall back to implicit authorization otherwise.
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" &&
action.lookup("unit") == "example.service" &&
subject.user == "alice") {
return polkit.Result.YES;
}
});
然后,指定的用户可以使用systemctl
和不使用来管理命名的服务sudo
。