目标:安装任何用户都应该能够启动的 systemd 服务。问题是启用用户服务(否sudo
),作为安装它的步骤(使用sudo
)。
我将一个服务文件放入/etc/systemd/user/
.这需要sudo
.
然后sudo systemctl --user enable my_service
不起作用,超级用户无法启用为用户提供的服务,只有用户可以这样做。
问题:我想安装该服务作为sudo make install
我的项目的一部分。sudo
此处需要,以便将服务文件复制到/etc/systemd/user/
(以及其他内容)。我希望此安装步骤也启用用户服务,以便用户无需启用它即可启动它。
我能想到的解决方案:
- 要求安装程序在之后执行额外的启用步骤(无需 sudo)
sudo make install
, - 作为安装步骤的一部分运行启用步骤,并使用
sudo -E -u $USER systemctl...
.-E
需要才能到达DBUS_SESSION_BUS_ADDRESS
(用户的 systemctl 需要)。问题是安装命令还需要-E -u $USER
,这是不寻常的。 - 如果失败,则要求用户运行
enable
该服务。start
- 以某种方式放弃该步骤的权限
enable
,不知道如何。
感觉这应该是一个常见的用例,人们通常如何解决这个问题?
答案1
为所有用户安装 systemd 用户服务
为了为所有用户安装 systemd 用户服务,您可以将.service
单元文件放置在以下列出的文件夹之一中用户单元搜索路径在man systemd.unit(5)
。重要的是:
/etc/systemd/user/*
(通常预计供系统管理员使用)/usr/lib/systemd/user/*
(通常预期由已安装的软件包使用)
您通常需要sudo
/root 权限才能将这些服务文件安装到这些文件夹中。
为所有用户启用 systemd 用户服务
如果你想为所有用户启用该服务,你可以使用--global
systemctl 的标志,例如 with systemctl --global enable
,这将需要sudo
/root 权限:
--global
当与enable和disable一起使用时,对全局用户配置目录进行操作,从而为所有用户将来的所有登录全局启用或禁用单元文件。
使用systemctl preset
代替systemctl enable
您可能需要考虑使用systemctl preset
代替systemctl enable
。它的工作方式与systemctl enable
,除非有系统预设文件其中有一行写着disable my-service.service
,在这种情况下它会systemctl disable
代替。
这可以让用户/管理员决定是否希望自动启用您的服务。例如,Fedora 有一个disable *
预设,因此 Fedora 上的所有 systemd 服务都是不是安装时默认启用。
顺便说一句,通常 systemd 服务不是由项目的 Makefile 安装/启用的,而是由包管理器安装的。
例如,如果您已经.deb
为 Debian/Ubuntu 创建了一个文件,则添加和启用 systemd 用户服务文件就像创建一个在包中sudo apt install ./my-deb
命名的文件一样简单。debian/my-package.user.service
然后dh_installsystemduser
将自动负责安装和启用它,以及在安装包时卸载/禁用它。
答案2
您可以通过为所有用户或特定用户启用特定的“无 sudo”命令执行来实现此目的。有问题的命令是:systemctl enable <my_service>
。阅读本文后并在执行说明之前,我鼓励您阅读$ man 5 sudoers
。
这可以通过两种方式完成:
/etc/sudoers
使用特定命令编辑您的:$ sudo visudo
。请注意:如果你搞砸了,你可能会损害你的主机,甚至使你无法sudo
访问。您将编辑的内容与下面的内容相同。- 创建一个文件:
$ sudo visudo -f /etc/sudoers.d/my_service
其内容我将在后面详细介绍。请注意,这与上面的直接修改一样微妙/etc/sudoers
。与/etc/sudoers.d/
编辑文件相比,删除文件的优点/etc/sudoers
是这样做可以创建在整个系统更新过程sudo
中持续存在的策略修改。sudoers
要编辑的内容是:
ALL <your_host_name>=NOPASSWD: /usr/bin/systemctl enable <my_service>
在这种情况下,它使ALL
(用户)能够在主机上发出(并执行)命令,<your_host_name>
而无需使用sudo
.
如果您只想为一个用户执行此操作,只需替换ALL
为该用户名即可。如果两者都不是(即不是ALL
且不是一个用户名,而是多个用户名),请创建一个用户别名来聚集有权发出 sudo-less cmd 的用户名。在这种情况下,您添加的一行将变成两行:
User_Alias <systserv_enable_users> = Kamela, bkd12, Oliver, Gauthier
<systserv_enable_users> <your_host_name>=NOPASSWD: /usr/bin/systemctl enable <my_service>
如果您决定将此行或这些行直接添加到/etc/sudoers
,请在以下行上方执行此操作:
@includedir /etc/sudoers.d
HTH。