如何注册 systemd 服务生命周期事件?

How do I register for systemd service lifecycle events?

我想了解服务单元的所有状态变化。我知道有 DBUS API 给我 UnitNew 和 UnitRemoved 的信号,但语义对我来说仍然不清楚。信号也没有提供我需要的信息。

我正在使用 go 并尝试了 coreos 的 go-systemd lib。它们提供了一种 "subscribe" 的方法,但它实际上是在轮询系统中所有可用的单元信息。我不想每隔几毫秒就这样做一次,只是为了了解状态变化。

我也试过默认的 org.freedesktop.DBus.Properties 但我无法正常工作。

如果可以的话,请帮忙,我没主意了。

包含有关服务单元启动或停止信息的systemd APIs是:

  • systemd 日志。您可以通过执行 journalctl or forwarding it via network to your program or watching for changes to the files on disk. E.g.: execute journalctl --follow -o json-pretty _PID=1 (you can add various filters like UNIT=gdm.service to only get those for one service) and then parse stdout according to the systemd journal json output format 来收听它以获取 systemd 的日志消息。使用 MESSAGE_ID 匹配事件的含义并观察未知消息以了解现有消息何时被新消息替换。虽然这可能足够稳健,但日志消息的主要目的并不是 API。因此,我建议使用以下选项。

  • Linux cgroup notifications as they get generated when systemd uses cgroups 启动服务。

  • systemd units 通过它们的依赖项(如 Wants=