我正在构建一个用 RPM 打包的私有应用程序,它将安装在包含以下 .preset 文件语句(例如
enable me-backend@.service 2 4 12
)的系统上,作为 /etc/systemd/system-preset/reviewer-app.preset
中的管理设置;每个系统指定一组不同的实例。
安装的systemd是
systemd-219-78.el7
我希望在安装“me-backend”RPM 时,正确的“systemctl 预设‘me-backend@*’”能够准确激活管理规定的实例。
此通配符命令行不起作用。它成功(返回 0),但未激活任何服务。我尝试过各种组合,例如“me-backend@*.service”、“me-backend@”,但没有成功。没有实例名称的变体会失败,并显示“无法执行操作:单元名称 me-backend@.service 缺少实例名称。”,而带有通配符的变体则无需执行任何操作即可成功。
我希望通过创建诸如“/etc/systemd/system/multi-user.target.wants/me-backend”之类的符号链接来启用实例 me-backend@2、me-backend@4 和 me-backend@12 @2.service' 用于 3 项服务中的每一项。
我尝试的另一种方法是“全部预设”,但是这会重置所有已安装应用程序的预设,这对我的包来说是错误的。我认为我的包应该只涉及它提供的服务/实例。
为了在安装时启用此服务的管理预设实例,rpm 规范应运行 systemctl preset 命令的正确语法是什么?
我已经从 StackExchange 回答了我自己的相关问题 - 答案是针对 systemd 219 的 RPM(例如 CentOS 7 rpm)不能依赖“systemctlpreset myservice@.service”语法,因为 systemd 219 不支持实例预设.
这里问题(“如何编写预设服务实例的 RPM 规范”)的答案是:
语法
enable me-backend@.service 2 4 12
在 CentOS 7 上无效,因为 systemd 219 尚不支持此功能。相反,系统管理员必须使用 me-backend.target
编译指示在本地 Requires=
覆盖文件中列出所需的实例。集成商必须在预设文件中列出 enable me-backend.target
。
示例
/etc/systemd/system/me-backend.target
:
[Unit]
Description=Me backend %I-bit
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
Requires= \
me-backend@2.service \
me-backend@4.service \
me-backend@12.service
[Install]
WantedBy=multi-user.target
Integrator 指定在
me-backend.target
中启用 /etc/systemd/system-preset/reviewer-app.preset
预设:
enable me-backend.target
RPM 中的开发人员包:
me-backend@.service
中的/usr/lib/systemd/system/me-backend@.service
,描述实例如何启动me-backend.target
中的default
/usr/lib/systemd/system/me-backend.target
在Requires=
行上列出了一组合理的默认实例,如上所示:开发人员指定激活
me-backend.target
预设的 scriptlet:
%post
%systemd_post %{name}.target
%preun
%systemd_preun %{name}.target
%postun
%systemd_postun %{name}.target
在 RPM 安装时,安装脚本会执行
systemctl daemon-reload; systemctl preset me-backend.target
,触发集成商的实例列表被启用。
me-backend.target
由集成商作为预设启用,并且 Requires=
是管理员在 me-backend.target
/etc
覆盖中指定的实例。
在未设置预设的系统上,由于发行版的
disable *
,不会启动任何实例
在设置了预设但管理员未在
/etc/.../me-backend.target
覆盖中列出特定实例的系统上,开发人员认为合理的默认实例(即打包的 /usr/lib/.../me-backend.targets
)将启动。
注意: 至少有一个人投票决定关闭此问题,因为它不是一个编程问题。我认为这是一个编程问题,因为 RPM SPEC 文件的内容是开发人员必须提供的安装脚本,并且该问题询问什么是正确的,如发行版所设想的那样,针对特定目标 CentOS 的安装命令在本例中为 7。 相关问题是一个 Unix 问题。它根本不关心 RPM 规格,而是关心某个版本的 systemd 的功能。在这个问题中,开发人员不需要关心 systemd 可以做什么,而是关心如何提供正确的安装。