即使 After= 服务未启动,Systemd 目标文件也会启动

Systemd target file starts eventhough the After= service is not started

好的,首先,我想实现的是,如果 systemd 服务在默认情况下停止且未启用,则不会进行垃圾回收。 我需要这个是因为 current problem with the node exporter from Prometheus 用于监视目的。

我确实已经实现了我的目标,但我不确定它为什么有效以及是否有可能的副作用。

举个例子,我在 Ubuntu 18.03 上安装了 ntp,禁用了该服务并将其停止。现在我想让我的节点导出器告诉我,ntp.service 是不活动的,但是 ntp get 的垃圾被 systemd 收集了。我读到,在这种情况下,可以通过在某处使用 ntp 作为依赖项来防止这种情况。使用 Wants= 没有帮助,因为如果我的依赖服务重新启动,这将导致我的 ntp 重新启动。所以我做了一些实验,然后创建了一个 test.target 文件,如下所示:

#/etc/systemd/system/test.target
[Unit]
Description=Testing purpose
After=ntp.service

[Install]
WantedBy=Multi-user.target

我启用了该服务并在禁用和停止 ntp 的情况下启动它。现在这是我的实际问题。尽管 ntp.service 不是 运行,但我的 test.target 文件确实已启用并没有问题地启动。有趣的是它也做了我想要的,ntp 没有收集垃圾,即使它被禁用和停止。

所以我真的很想知道为什么这有效,为什么 After= 被忽略了?

After= 未被忽略,它导致 systemd 加载单元(如果尚未加载)并阻止垃圾回收。 After= 并不意味着它将开始 ntp.service,因为你应该使用 Requires=.

检查Unit Garbage Collection, Requires, and After