我有一个.spec
用于安装 rpm 的文件。我在安装后有以下代码片段(%post scriplet)
%post -n %{package_name}
# Enable the service at boot time
%if %{?suse_version:1}0
/usr/lib/lsb/install_initd %{_initrddir}/%{package_name}
%else
chkconfig --add %{package_name}
%endi
在zypper install package_name
安装后阶段失败并出现以下错误:
/var/tmp/rpm-tmp.Z5R29N: line 2: /usr/lib/1sb/install _initd: No such file or directory
warning: %post (package_name.sles15.x86_64) scriptlet failed, exit status 127
我是 rpm 的 .spec 文件新手,但此 scriplet 失败,因为/usr/lib/lsb/
SLES 15 SP4 中不存在目录
我的问题是:
- 这个脚本到底在做什么?
- 从哪里获取此
/lsb/
包以便我可以在 SLES 15 SP4 中创建此路径?我检查 SLES 15 SP4 是否预装了 lsb-xxx 软件包,但它们在这里不起作用? - 我是否需要在此 scriplet 内对 sles 15 SP4 进行案例检查?喜欢:
%if 0%{?sle_version} == 150400 && 0%{?is_opensuse}
// do somthing
%endif
答案1
该规范非常过时
这个脚本到底在做什么?
该代码片段的作用是将脚本安装到init.d
,这些脚本由sysv-init
, 在启动时启动服务
自 SLE 12 以来,SUSE(以及大多数其他发行版也已切换)一直在使用systemd
,init.d
完全过时并保证切换到服务
从哪里获取此 /lsb/ 包以便我可以在 SLES 15 SP4 中创建此路径?我检查 SLES 15 SP4 是否预装了 lsb-xxx 软件包,但它们在这里不起作用?
你不能,现在对这些启动和管理服务的方法的支持非常有限,其中之一是systemd-sysv-generator
systemd
,这是一个解决方案,但如果这是一个重要的软件,我会选择本机解决方案。
但该代码片段永远无法在 SLES 15 上运行,它需要完全重写,因为chkconfig
不会也无法运行
我是否需要在此 scriplet 内对 sles 15 SP4 进行案例检查?喜欢:
如果您仍然支持SLE < 12
,并且需要保留旧的方式来做到这一点,是的,您可以这样做
如果你想使其原生,你需要做什么:
- 查找它尝试安装的脚本
- 使用该脚本作为参考,构建一个Systemd服务单元文件
- 如果您有源并且可以修改它,请将其添加到源中。如果您没有可修改的源代码,则需要在构建时对其进行修补。
- 删除该片段并遵循指导(来自 openSUSE,但在 SLE 上工作得很好)将其构建到您的代码中
%if 0%{?sle_version} == 150400 && 0%{?is_opensuse}
仅供参考,这是一个仅匹配 openSUSE Leap 15.4 而不是 SLE 15.4 的条件,这不是问题,因为 Leap 和 SLE 是同一件事,但可能会令人惊讶