我已经按照本教程进行操作: 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::notify
和 libsystemd::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/