我有一个嵌入式 Linux 系统,我想在遇到内核恐慌时自动重新启动。但是,有没有一种方法可以在启动时可靠地确定上次重新启动是由于内核恐慌还是干净重新启动?
看来我不能依赖syslogs
或kern.log
特别是因为当我故意使用以下命令触发内核恐慌时:
echo c > /proc/sysrq-triger
下次启动时,它们中syslogs
都kern.log.*
没有任何内核恐慌转储。
我还查看了也许读取输出last -x
以获取上次重新启动不干净的提示,但crash
仅当pts
登录会话未完全终止时它才会显示。由于嵌入式系统在运行时没有使用 ssh 或串行进行手动交互并且没有用户登录,因此我也不能依赖它。
另请注意:我使用的嵌入式 BSP 不支持ramoops-pstore
,因此这也不适合我。
答案1
内核崩溃后,不会将任何信息写入日志,因为内核无法可靠工作(它可能具有损坏的文件系统结构,并且写入磁盘会使情况变得更糟)。
因此,您可以采取相反的方式,并在每次执行干净关闭或重新启动时添加代码以将消息写入日志,而不是检查日志中的内核恐慌条目。添加该代码的位置取决于您正在使用的初始化系统。
然后,在启动时,您可以检查该消息。如果您在与当前启动相关的条目之前找到它,那么您就知道关闭/重新启动不是由于内核恐慌,如果不存在,则发生了内核恐慌(或断电)。