配置 systemd 服务的顺序

配置 systemd 服务的顺序

我有两个通常彼此不相关的服务:JBoss 和WebSphereMQ。

现在,因为部署在 JBoss 上的应用程序需要 WebSphereMQ,所以我想将 JBoss 配置为在 WebSphereMQ 之后启动。

由于脚本/服务文件来自包管理器,我想避免编辑它们。

Systemd 确实允许对/目录内的服务进行本地配置Wants和使用符号链接,但是根据文档并不强制排序,我认为这同样适用于(文档在这一点上没有明确),但是没有基于符号链接的等效功能用于配置和。Requires${service}.wants${service}.requiresRequiresWantsAfterBefore

如何在不编辑 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)

相关内容