为所有用户安装并启用 systemd 用户服务

为所有用户安装并启用 systemd 用户服务

目标:安装任何用户都应该能够启动的 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 用户服务

如果你想为所有用户启用该服务,你可以使用--globalsystemctl 的标志,例如 with systemctl --global enable,这将需要sudo/root 权限:

--global

当与enable和disable一起使用时,对全局用户配置目录进行操作,从而为所有用户将来的所有登录全局启用或禁用单元文件。

取自man systemctl(1)

使用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。

相关内容