如何让我的Rust程序与systemd的WatchDog通信?

j0pj023g  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(142)

我已经按照这个教程:https://www.linode.com/docs/guides/start-service-at-boot/并设置所有内容。

因为我的问题就是这个:https://unix.stackexchange.com/questions/298027/restart-systemd-service-when-output-is-no-longer-generated我也按照这里的答案来做。

问题 * 与解决方案 *:运行7小时后,程序卡住。没有输出生成,systemd没有重新启动它。
在my_service. services中,两个都是建议的强制条目,其他所有内容都是正确的

WatchdogSec=30
Restart=on-watchdog

我可以手动让我的Rust程序与systemd通信吗?如果可以-怎么做?我希望它定期在特定的线路上通知systemd。
文档非常少:我一点也不明白。
另一个例子crate libsystemd,有3个搜索结果WatchDog和这一个是最相关的我猜. https://docs.rs/libsystemd/latest/libsystemd/daemon/enum.NotifyState.html#variant.Watchdog
我想知道我是如何在这里完成任何事情的。我只是把这一行粘贴到我想要的程序中的任何地方吗?
libsystemd::daemon::NotifyState
它如何知道PID?
在任何情况下:这些包中的每一个都有多个方法,我的程序在1-24小时后挂起,反复试验可能需要几周的时间。
如何让我的Rust程序从内部线程与systemd进行通信,或者如果不可能的话,只需手动设置并确保WatchDog接收到我想要的信号?从Rust程序向systemd发送单个通知的代码行是什么?
如上所述,转到逻辑很简单:如果没有打印输出,重新启动程序

x8diyxa7

x8diyxa71#

你必须以某种方式发送消息。通过寻找使用NotifyState的函数,我找到了systemd::daemon::notifylibsystemd::daemon::notify,两者都可以。
例如:

use systemd::daemon::{notify, STATE_WATCHDOG};
notify(false, [(STATE_WATCHDOG, "1")].iter()).unrwap();

相关问题