如何中断系统重启?

如何中断系统重启?

我目前有一个系统,每 3 次重新启动就有 1 次重新启动,我可以找到日期时间,并且可以找出谁(只是说系统),但我无法找出原因。

我想知道是否有可能用一个无用的脚本替换重新启动脚本(以及我将如何做到这一点?),以便它可以捕获谁、在哪里以及为什么尝试激活重新启动?

我正在使用 linux linaro - 这是一个基于 ubuntu 的 FS - 欢迎任何有关调试此问题的建议

答案1

脏脚本方式

重启有多种方法。我认为可以研究的一种方法是使用脚本替换关机、停机、重启和初始化:

for cmd in shutdown halt reboot init
do 
    mv /usr/bin/$cmd /usr/bin/${cmd}.ori
    ln -s /usr/bin/${cmd}.ori /usr/bin/$cmd
done

然后创建一个记录信息的 shell 脚本:

#!/bin/bash
echo "$0 called with $@ by $USER at `time` - Processes: `ps axjf`" >> /var/log/reboot.log
${0}.ori $@

并将其复制或链接为/usr/bin/{shutdown,halt,reboot,init}.您还需要创建/var/log/reboot.log并确保任何人都能够登录它,尽管root只能重新启动。

应该ps axjf允许您查看哪个进程调用了您的脚本。您可能想在日志中添加更多信息,但这应该是一个好的开始。

可能会错过的事情

其他命令可以通过调用系统调用来重新启动系统reboot。它可能是“官方”命令或“流氓”命令。

X 服务器能够关闭,并且通过一些设置,任何用户都可以做到这一点。如果允许远程访问和关机,其他人可以要求远程关机(但这并不能解释每隔 3 次重新启动的行为)。

初始化目标

你可以:

  • 添加一个步骤在目标的开头在运行级别 0 和 6 中等待一段时间(例如:sleep 60或多一点)
  • 有一个脚本ps axjf每 60 秒运行一次并记录在文件中

这应该提供关闭时正在运行的进程的信息。当然,您可以添加其他命令来帮助您调查每 60 秒执行的内容

内核审计

调查此问题的另一种方法是使用内核审计功能,但需要在您的内核中启用它(在许多发行版中并非如此)。

然后使用:

auditctl -a entry,always -S reboot

记录每次重新启动的呼叫,并使用ausearch查找已完成的呼叫。

相关内容