![在 22.04 中构建包时 systemctl 不可用?](https://linux22.com/image/952220/%E5%9C%A8%2022.04%20%E4%B8%AD%E6%9E%84%E5%BB%BA%E5%8C%85%E6%97%B6%20systemctl%20%E4%B8%8D%E5%8F%AF%E7%94%A8%EF%BC%9F.png)
我的构建服务器运行良好,但对于尝试在其postinst
脚本中使用某些命令的项目,它会失败。
我当前遇到的问题是systemctl
。
我有一个名为的项目iplock
这是另一个项目 () 的依赖项snapwebsites
,它包含一个名为 的服务ipload
。所以我必须启动该单独的服务手动为此,我运行以下命令iplock.postinst
:
systemctl enable ipload
if ! systemctl start ipload
then
echo "ERROR: the ipload command failed to load the firewall on installation."
fi
产生的错误:
/var/lib/dpkg/info/iplock.postinst: 110: systemctl:未找到
dpkg: 处理软件包 iplock 时出错(--configure):
已安装 iplock 包安装后脚本子进程返回错误退出状态 127
看起来构建系统没有安装,systemctl
因此尝试构建时命令失败snapwebsites
。
我应该做些什么?
我检查了debhelper
脚本。也许我们应该使用deb-systemd-helper
perl 脚本?我不喜欢必须测试我是在实际安装还是在构建系统内安装。可能是我缺少依赖项?尽管似乎deb-systemd-helper
对其他服务执行了正确的操作(那些与项目同名的服务按预期安装在构建系统 chrooted 环境中,您可以运行它debuild
)。
答案1
我发现有一个覆盖可以用于此目的:
override_dh_installsystemd:
dh_installsystemd
dh_installsystemd --name=ipload
请注意,您需要兼容级别 12 或更高才能使此覆盖生效(即,值debian/compat
必须至少为 12)。
使用这种技术,如果存在 systemd,服务就会被安装、启用和启动,所有这些都是在后台进行的。如果不存在 systemd(如在构建系统中),则什么也不会发生。
注1:第一个dh_installsystemd
安装的,ipwall
将其作为默认的 systemd 服务处理。
笔记2:第二种方法dh_installsystemd
要求将 .service 文件命名为iplock.ipload.service
。partiplock
是要添加该服务的包。此技术还可用于在一个包中添加多个服务。
欲了解更多信息,我建议阅读dh_installsystemd
手册页并对该命令进行进一步搜索。