rust - 如何让我的 Rust 程序与 systemd 的 WatchDog 进行通信?

标签 rust systemd

我已经按照本教程进行操作: 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.service 中都是建议的强制条目 其他一切都是正确的

WatchdogSec=30
Restart=on-watchdog

我可以手动让我的 Rust 程序与 systemd 通信吗?如果是的话——怎么办?我想让它定期在特定行通知 systemd。

文档再简单不过了: https://docs.rs/systemd/latest/systemd/daemon/constant.STATE_WATCHDOG.html 我什么都不懂..

另一个示例箱 libsystemd,WatchDog 有 3 个搜索结果,我认为这个是最相关的。 https://docs.rs/libsystemd/latest/libsystemd/daemon/enum.NotifyState.html#variant.Watchdog

我不知道我是如何能够在这里完成任何事情的。我是否只需将此行粘贴到程序中我想要的任何位置?

libsystemd::daemon::NotifyState

它如何知道PID?

无论如何:这些包中的每一个都有多种方法,并且我的程序在 1-24 小时后挂起,尝试和错误可能需要数周时间。

如何让我的 Rust 程序从内部线程与 systemd 通信,或者如果不可能 - 只需手动设置它并确保 WatchDog 收到我想要的信号?从 Rust 程序向 systemd 发送单个通知的代码行是什么?

如上所述,转到逻辑很简单:如果没有打印输出,则重新启动程序

最佳答案

您必须以某种方式发送消息。通过查找使用 NotifyState 的函数,我发现了 systemd::daemon::notifylibsystemd::daemon::notify 其中之一就可以了。

例如:

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

关于rust - 如何让我的 Rust 程序与 systemd 的 WatchDog 进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74628597/

相关文章:

rust - 防止直接初始化类型别名

rust - 我该如何解决这个终身问题?

rust - 在反序列化时,使用serde将外部字符串引用(ID/ “foreign keys”)解析为同一文档中其他地方存在的结构

linux - 使 ExecStartPost 命令在后台运行

docker - 从 docker 容器中结构化日志记录到日志

rust - 如何使 std::format 中的填充填充动态?

rust - 将 vec<&String> 转换为 vec<String> 哪种方式更好

python-3.x - 为什么 systemd 不在 session 总线上发送单元属性更改通知?

java - Kafka 的 Prometheus JMX Exporter java 代理无法运行

python - Systemd 丢弃随机的标准输出