我目前有一个系统,每 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
查找已完成的呼叫。