c++ - 如何在看门狗执行之前将日志复制到闪存?
问题描述
如何在看门狗执行之前执行一些脚本(在我的情况下,它会将日志复制到闪存或远程复制日志的脚本)?
我应该修改linux内核看门狗驱动程序吗?如果有,用什么方法?或者也许可以通过以下方式配置它:
/etc/default/watchdog
/etc/watchdog.conf
但是,我们在看门狗配置受限的地方安装了busybox。我在谷歌上找不到任何东西,令人惊讶的是,这是需要解决的基本问题 - 每个人都希望在看门狗重置后在持久内存中拥有日志,闪存不是 /var/log/ 路径。
当然,在正常的设备生命周期中不时复制日志到闪存的解决方案并不是一个好主意,因为应该有一些解决方案,当喂食 /dev/watchdog 时的看门狗超时到期时如何做到这一点。
解决方案
在高于 4.9 的 linux 内核上,您应该可以使用 pretimeout 调控器框架,它允许您编写一个 linux 内核驱动程序,该驱动程序将对检测到 pre-timeout 做出反应。像这样的解决方案远远超出了简单问答的范围,所以我将保留我原来的答案。
TL;博士:
如果在操作系统仍在运行时可以检测到问题,您可以刷新日志。如果问题是由操作系统锁定引起的,那么您将没有机会解决问题,因为硬件将重置该框。
这里有两件事:
- 看门狗设备
- 看门狗程序
看门狗设备通常是一个硬件定时器,当它的定时器到期时,它会做一些“特别低级别的事情”。最常见的低级操作是重置盒子。如果它发生在硬件中,则没有操作系统参与。一旦计时器用完,您将没有机会做任何高级别的事情 - 例如在某处写入日志文件。
看门狗程序是一个工具,只要它的检查条件得到满足,它就会定期向看门狗设备保证。
busybox 看门狗定时器的条件是一个简单的循环(伪代码):
while (1) {
# reassure watchdog
# sleep some time
}
因此,如果程序停止运行——例如由于操作系统锁定或程序终止,那么底层硬件将直接启动。
“更大”的看门狗二进制文件提供了一堆检查,如果它们失败,那么它将触发repair-binary
选项中的/etc/watchdog.conf
尝试恢复。这将是刷新日志的潜在点。
推荐阅读
- sql - 当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式。SQL
- ios - 如何在 iOS 13 中调暗状态栏
- c# - 在面板中选择多个文本框
- php - 如何在 Laravel 中显示分组值
- javascript - 将 Html 元素转换为 JavaScript 对象
- ios - Xcode 11,使用 Main.storyboard 修复的主界面
- c# - 如何在asp.net核心中逐块从SQL Server数据库中下载文件?
- excel - 我怎样才能得到一个省略错误的平均公式
- angular - 按 ID 删除数据
- android - 为什么我不能将元素添加到地图数据类型(Dart/Flutter)