我有两个通常彼此不相关的服务:JBoss 和WebSphereMQ。
现在,因为部署在 JBoss 上的应用程序需要 WebSphereMQ,所以我想将 JBoss 配置为在 WebSphereMQ 之后启动。
由于脚本/服务文件来自包管理器,我想避免编辑它们。
Systemd 确实允许对/目录内的服务进行本地配置Wants
和使用符号链接,但是根据文档并不强制排序,我认为这同样适用于(文档在这一点上没有明确),但是没有基于符号链接的等效功能用于配置和。Requires
${service}.wants
${service}.requires
Requires
Wants
After
Before
如何在不编辑 rpm 安装的文件的情况下清晰地定义这种关系?
答案1
您的问题包含两个单独的问题:(a) 如何将服务依赖项转换为 systemd 单元文件语法;(b) 如何在不更改软件供应商提供的单元文件的情况下更改单元定义。
至于 (a),您正确地注意到您需要After=
关键字。 JBoss 单元文件应包含两个都 After=<WebSphereMQ unit name>
和Wants=<WebSphereMQ unit name>
。原因是:单元之间的函数依赖关系和单元启动的顺序是单独的变量/维度。有时您希望每次服务 B 启动时服务 A 也启动,这就是Wants=
和 的Requires=
用途。有时,如果服务 B 已在队列中,您希望服务 A 在服务 B 之后启动;这就是After=
和Before=
的用途。通常你两者都想要。
对于(b),您需要使用称为“drop-ins”的功能。它们从一开始就在 systemd 中可用,但文档分散在许多手册页中并且很难找到。这在最近的版本之一(我相信是 219)中发生了变化,当时在接近末尾添加了详细描述man 系统单元。
Drop-ins 是一些小的配置位,可以覆盖现有单元定义的部分内容。他们的目标是允许系统管理员进行本地更改,而不必覆盖软件供应商提供的单元文件(因此软件更新更容易一些,因为您不必担心包管理器会覆盖您的更改)。
Drop-ins 是名称以 和 结尾的文本文件.conf
,放置在<unit name>.d
目录中。
在您的情况下,您想要创建目录/etc/systemd/system/jboss.service.d/
(假设 JBoss 附带jboss.service
单元文件),然后创建webspheremq.conf
包含以下内容的文件:
[Unit]
Wants=WebSphereMQ
After=WebSphereMQ
重新加载 systemd 配置 ( systemctl daemon-reload
) 后,您应该会看到systemctl show jboss.service
和中的更改systemctl status jboss.service
。这是第二个命令的预期内容(注意“Drop-In”行):
● [email protected] - rsnapshot monthly backup
Loaded: loaded (/etc/systemd/system/[email protected]; static)
Drop-In: /etc/systemd/system/[email protected]
└─after.conf
Active: inactive (dead)