如何创建启用 systemd 用户服务的 DEB postinst 脚本?

tbr*_*n89 7 systemd deb

我尝试创建一个 DEB 文件来安装 systemd 用户服务,并使用 postinst 脚本在安装后启用该服务。这是我的 postinst 脚本:

#!/bin/bash

set -e
systemctl --user enable myservice.service
Run Code Online (Sandbox Code Playgroud)

当我安装 DEB ( dpkg --install mypackage.deb) 时,它运行 postinst 脚本并返回以下错误消息:

无法连接到总线:没有这样的文件或目录

我也不能使用系统服务,并且包不会被发布,所以我不关心任何打包标准。我能做些什么来让这项工作成功吗?

如果不可能,我会将其添加到我的初始化脚本中,以便在每次启动后启用它,但如果可能的话,我想避免这种情况。

Mar*_*rad 8

你试图做的事情是行不通的。为执行安装的用户安装 systemd 服务并不是很有用,因为该用户始终是 root。因此,您可能应该遵循将服务安装为所有用户的系统范围服务的约定。以下是执行此操作的标准方法:


现在大多数软件包都使用 debhelper - 它大大简化了过程。以下步骤应该可以帮助您入门。请参阅Debian Wiki 的 systemd 打包指南以获取更多信息。

启用 dh_systemd

使用 debhelper compat level 10(检查和Build-Depends中的部分),dh-systemd 会自动启用,您可以跳过此部分。对于较旧的 debhelper 兼容级别,您必须按照以下步骤启用它:debian/controldebian/compat

  • 添加dh-systemd (>=1.5)Build-Dependsdebian/control
  • 附加--with systemd到您的dh $@行中debian/rules

使用 dh_systemd

将您的 systemd 单元文件放入其中debian/,以便安装它们。Debhelper 将在软件包安装过程中自动检测并启用它们。

注意:无需向postinstpostrm脚本添加任何内容,debhelper 会自动为您处理这些事情。另请记住,您的手动方法依赖于systemctl可执行文件,因此仅适用于用户安装软件包时已安装 systemd 的计算机。即使未安装 systemd,debhelper 方法也将启用 systemd 服务。如果用户稍后切换到 systemd,该服务已启用。如果您的软件包同时附带旧的 Sys-V 风格的初始化脚本和 systemd 单元文件,则 debhelper 方法也能很好地工作。

提前使用

如果您有特殊需求(例如安装多个单元文件但仅启用其中的一个子集),您可以覆盖dh_systemd_enabledh_systemd_start目标debian/rules并指定其他参数。有关详细信息,请参阅dh_systemd_enabledh_systemd_start的手册页。