C语言 systemd sd_notify通过SIGHUP重新加载服务

kxe2p93d  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(109)

我正在实现一个使用sd_notify的systemd服务。
sd_notify documentation中,声明这样的服务必须在重新加载完成后发送sd_notify(0, "READY=1");
这对于由服务本身触发的重新加载是有意义的,但我想知道这对用户(systemctl reload)触发的重新加载有什么影响,因为systemd.service文档指出,reload命令应该是同步的,以等待重新加载完成。
我现在的问题是:我可以在notify服务上使用异步命令(如/bin/kill -HUP $MAINPID)并使用RELOADING=1READY=1来获得“阻塞”重新加载吗?让systemd等待我的服务,或者systemd在从systemctl重新加载的情况下忽略这两个?
对于完整性:我的代码和我想要的:

void doReload() {
    sd_notify(0, "RELOADING=1");
    // operation that takes ca 5 seconds
    sd_notify(0, "READY=1");
}

这个方法可以从内部代码调用,也可以由为SIGHUP注册的信号处理程序调用。
systemd单元的相关部分是:

[Service]
Type=notify
NotifyAccess=main
ExecStart=/usr/bin/testd
ExecReload=/bin/kill -HUP $MAINPID

我想证明ExecReload是同步完成的。

rm5edbpk

rm5edbpk1#

Systemd 253添加了notify-reload服务类型:
notify-reload的行为与notify相同。但是,它以一种方式扩展了逻辑:当服务被要求重新加载时,SIGHUP UNIX进程信号被发送到服务的主进程。(要发送的信号可以通过SlogadSignal =进行调整,参见下文。)当启动重新加载过程时,服务将通过sd_notify(3)回复一条通知消息,该消息包含“RELOADING=1”字段以及设置为当前单调时间的“MONOTONIC_USEC=”(即,“RELOADING=1”字段与“MONOTONIC_USEC=”字段的组合)。clock_gettime(2)中的CLOCK_MONOTONIC),单位为μs,格式为十进制字符串。重新加载完成后,必须发送另一条通知消息,其中包含“READY=1”。使用此服务类型并实现此重新加载协议是提供用于重新加载服务配置的Executive ad =命令的有效替代方法。
示例单元文件:

[Service]
Type=notify-reload
NotifyAccess=main
ExecStart=/usr/bin/testd
# In case you want to use a signal other than SIGHUP for reloading:
#ReloadSignal=SIGUSR1

示例(省略错误检查):

void doReload() {
    timespec ts;
    clock_gettime(CLOCK_MONOTONIC, &ts);
    sd_notifyf(0, "RELOADING=1\nMONOTONIC_USEC=%" PRIdMAX "%06d", (intmax_t)ts.tv_sec, (int)(ts.tv_nsec / 1000));
    // operation that takes ca 5 seconds
    sd_notify(0, "READY=1");
}

相关问题