我尝试创建一个 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 脚本并返回以下错误消息:
无法连接到总线:没有这样的文件或目录
我也不能使用系统服务,并且包不会被发布,所以我不关心任何打包标准。我能做些什么来让这项工作成功吗?
如果不可能,我会将其添加到我的初始化脚本中,以便在每次启动后启用它,但如果可能的话,我想避免这种情况。
你试图做的事情是行不通的。为执行安装的用户安装 systemd 服务并不是很有用,因为该用户始终是 root。因此,您可能应该遵循将服务安装为所有用户的系统范围服务的约定。以下是执行此操作的标准方法:
现在大多数软件包都使用 debhelper - 它大大简化了过程。以下步骤应该可以帮助您入门。请参阅Debian Wiki 的 systemd 打包指南以获取更多信息。
使用 debhelper compat level 10(检查和Build-Depends
中的部分),dh-systemd 会自动启用,您可以跳过此部分。对于较旧的 debhelper 兼容级别,您必须按照以下步骤启用它:debian/control
debian/compat
dh-systemd (>=1.5)
到Build-Depends
中debian/control
。--with systemd
到您的dh $@
行中debian/rules
。将您的 systemd 单元文件放入其中debian/
,以便安装它们。Debhelper 将在软件包安装过程中自动检测并启用它们。
注意:无需向postinst
和postrm
脚本添加任何内容,debhelper 会自动为您处理这些事情。另请记住,您的手动方法依赖于systemctl
可执行文件,因此仅适用于用户安装软件包时已安装 systemd 的计算机。即使未安装 systemd,debhelper 方法也将启用 systemd 服务。如果用户稍后切换到 systemd,该服务已启用。如果您的软件包同时附带旧的 Sys-V 风格的初始化脚本和 systemd 单元文件,则 debhelper 方法也能很好地工作。
如果您有特殊需求(例如安装多个单元文件但仅启用其中的一个子集),您可以覆盖dh_systemd_enable
和dh_systemd_start
目标debian/rules
并指定其他参数。有关详细信息,请参阅dh_systemd_enable和dh_systemd_start的手册页。
归档时间: |
|
查看次数: |
8880 次 |
最近记录: |