C systemd如何向服务发送消息以获得sd_notify(3)响应?

C systemd如何向服务发送消息以获得sd_notify(3)响应?,c,daemon,systemd,status,shutdown,C,Daemon,Systemd,Status,Shutdown,我很难理解Systemd的通知模型和几个工作流。Systemd通知使用接口进行。sd\u notify(3)接口为守护进程提供了一种告知systemd其状态的方法: #include <systemd/sd-daemon.h> int sd_notify(int unset_environment, const char *state); int sd_notifyf(int unset_environment, const char *format, .

我很难理解Systemd的通知模型和几个工作流。Systemd通知使用接口进行。
sd\u notify(3)
接口为守护进程提供了一种告知systemd其状态的方法:

#include <systemd/sd-daemon.h>

int sd_notify(int unset_environment,
    const char *state);

int sd_notifyf(int unset_environment,
    const char *format,
    ...);

...
我遇到的另一个工作流是关机。我不知道Systemd是如何向守护进程发送关闭消息的

在这两种情况下,我觉得我的可执行文件应该导出一个函数,Systemd应该调用其中的查询和消息

Systemd如何告诉守护进程报告其状态或关闭?

通常,Systemd不会向守护进程发送消息。您的守护进程应该在每次内部状态更改时生成状态通知。否则,如果进程挂起(暂时或永久挂起),用户的状态请求将不会起任何作用。请注意,守护进程的输出也会显示出来,因此可能没有必要总是调用
sd\u notify


停止通常应由信号处理,或者可能使用
ExecStop=
运行
fooctl
进程,该进程通过套接字发送消息并等待回复。

谢谢。“每次内部状态更改时生成状态通知”的问题是,它只说明过去某个时间的状态。它无法报告挂起的进程,这似乎是有人会
systemctl status mydaemon.service
的原因。(这与代码签名遇到的问题是一样的——认证只适用于过去某个时间的某些代码。它没有说明当前正在执行的代码)。为了澄清,按照您描述的方式,您根本不会得到任何状态输出。按照它的实际工作方式,您只需获得最后一次更新,这对于回答“挂起时它在做什么”很有用。如果要捕捉挂起本身,请设置
WatchdogSec=
systemctl status mydaemon.service