如何追踪随机重启的原因?

一台Thinkpad X220(Core-i5,SandyBridge,Intel GMA)运行Precise 64位系统,在过去的四天里已经出现了两次突然重启。当时我只是在写邮件,没有任何警告。屏幕突然变黑,下一刻我看到的就是联想的启动画面。
我应该从哪里开始寻找原因呢?我担心这种立即重启的情况可能没有留下足够的时间来记录日志...
谢谢!
4个回答

检查/proc/sys/kernel/panic;如果其值为1,则服务器将在发生紧急情况时立即重新启动。有缺陷的驱动程序可能会导致内核恐慌。
如果不是紧急情况,请检查最近一次重启的问题,也许过热是问题所在。
last reboot

1这个命令显示我的系统使用了一个新的内核。Ubuntu 12.04 64位。重启后为3.2.0-63,之前为3.2.0-61。 - Antonios Hadjigeorgalis
6这促使我检查了 etc/apt/apt.conf.d/50unattended-upgrades 文件,我之前设置了 Unattended-Upgrade::Automatic-Reboot "true"; ,现在我将其改回了默认的 false 设置。 - Antonios Hadjigeorgalis
@Antonios 这个自动重启是不是没有警告? - Aquarius Power
@内部人 我得到了一个奇怪的日志,因为上一个会话与当前会话相关联? 18:30 - 18:38 (00:07) 并且在突然重新启动之前 13:27 - 18:38 (05:11) - Aquarius Power
10刚刚发现了这个:13:55 - 崩溃 (04:35),我要追踪一下发生了什么,谢谢! - Aquarius Power
1@AquariusPower 是的,确实是这样。在更改了无人值守升级设置后,我的问题解决了。 - Antonios Hadjigeorgalis
我也遇到了同样的问题。last | head -n 50显示了pts/14 :0 Thu Jul 14 08:28 - crash (00:00):0 :0 Thu Jul 14 08:27 - crash (00:01) - Olumide

指令

  1. dmesg - 如果系统仍在运行,可能无法显示上次启动之前的项目,但非常有用

文件

  1. /var/log/syslog - 系统范围的日志记录器,使用 tail /var/log/syslogless /var/log/syslog
  2. /var/log/kern.log - 内核日志,与上述相同
  3. /var/log/*

非常感谢您的回答。问题是 - 如我在问题中所述 - 系统不再运作。我相信这是某种硬件问题。 - Andre
1我进行了一次快速的谷歌搜索,以检查上述文件是否在重新启动后仍然存在(因为我目前不在一台Linux电脑前),我找到了这个网站,我觉得非常有用:http://www.softpanorama.info/Commercial_linuxes/troubleshooting.shtml - Huckle
2你能详细说明一下dmesg的输出如何帮助解决问题吗?我的机器刚刚随机重启了,如果我理解你的建议正确的话,那么dmesg在这里无法提供帮助,对吗? - tchakravarty
我想要添加这个命令 grep "Jan 11 01" /var/log/* -rah 2>/dev/null |sort,这样你就可以定位到特定的日期和小时(适用于Ubuntu 16.04,但部分信息与版本无关)。 - Aquarius Power

简而言之: @insider的回答以及@Antonios Hadjigeorgalis的评论让我发现了一个问题。

Unattended-Upgrade::Automatic-Reboot "true"

/etc/apt/apt.conf.d/99custom-unattended-upgrades

我经历了突然重启的问题,大多发生在早上开机后不久。我使用的是Ubuntu 18.04操作系统。运行last reboot命令显示,在突然重启之后,内核版本通常会更新为较新的版本。
reboot   system boot  4.15.0-112-gener Wed Jul 22 10:07   still running
reboot   system boot  4.15.0-111-gener Wed Jul 22 10:01 - 10:06  (00:04)
...
reboot   system boot  4.15.0-111-gener Wed Jul 15 09:49 - 23:43  (13:53)
reboot   system boot  4.15.0-109-gener Wed Jul 15 09:45 - 09:48  (00:03)
...
reboot   system boot  4.15.0-109-gener Fri Jul  3 09:14 - 17:37  (08:23)
reboot   system boot  4.15.0-108-gener Fri Jul  3 09:08 - 09:13  (00:05)

查看了/etc/apt/apt.conf.d/50unattended-upgrades文件,发现"Unattended-Upgrade::Automatic-Reboot"被注释掉了,默认值应该是false。然后我运行了以下命令:
grep Reboot /etc/apt/apt.conf.d/*
/etc/apt/apt.conf.d/50unattended-upgrades:Unattended-Upgrade::Automatic-Reboot "false";
/etc/apt/apt.conf.d/50unattended-upgrades://Unattended-Upgrade::Automatic-Reboot-Time "02:00";
/etc/apt/apt.conf.d/99custom-unattended-upgrades:// Reboot automatically if necessary (e.g. on kernel upgrade), should be
/etc/apt/apt.conf.d/99custom-unattended-upgrades:Unattended-Upgrade::Automatic-Reboot "true";

这就是我的问题所在 - 在 /etc/apt/apt.conf.d/99custom-unattended-upgrades 中有一行代码 Unattended-Upgrade::Automatic-Reboot "true";

应用程序崩溃会在/var/crash/目录下生成崩溃文件;我还会查看正常的系统日志,这是你最好的选择。如果硬件关机,你在systemd和message日志中将看不到任何信息(一个巨大的线索!!)。如果Ubuntu知道关机的原因,你也会看到相应的记录。(如果没有找到详细信息,你需要检查机器日志;例如,如果是虚拟机,则检查主机操作系统日志,如果是物理机,则检查硬件日志)。
要查看此设备上的应用程序崩溃情况。
guiverc@d960-ubu2:/de2900/ubuntu_64$   ls -la /var/crash
total 113484
drwxrwsrwt  2 root    whoopsie      4096 Feb 27 12:00 .
drwxr-xr-x 16 root    root          4096 Nov 29  2018 ..
-rw-------  1 root    whoopsie   1214905 Feb 26 08:28 irssi-scripts.0.crash
-rw-------  1 root    whoopsie   1193193 Feb 25 15:04 lvm2.0.crash
-rw-r-----  1 guiverc whoopsie 101162337 Feb 19 13:00 _usr_bin_clementine.1000.crash
-rw-r-----  1 guiverc whoopsie   5962296 Feb 26 23:31 _usr_bin_gnome-control-center.1000.crash
-rw-r-----  1 guiverc whoopsie   1519149 Feb 20 08:28 _usr_bin_light-locker.1000.crash
-rw-r-----  1 guiverc whoopsie   1327084 Feb 27 12:00 _usr_bin_totem-video-thumbnailer.1000.crash
-rw-r-----  1 guiverc whoopsie     96196 Feb 22 13:55 _usr_games_sgt-launcher.1000.crash
-rw-r-----  1 guiverc whoopsie   3685288 Feb 22 00:34 _usr_lib_ibus_ibus-ui-gtk3.1000.crash

从应用程序崩溃开始调查是最简单的,所以我会首先查看这方面。然而,我真的想不出为什么应用程序崩溃会导致重启或关机;所以我不指望在那里找到任何有意义的信息(如果有用的话,会出现在系统日志之后)。
要查看系统消息(当前会话),您可以使用dmesg命令。因为它只显示当前会话,所以您看不到上次关机的原因(那是上一个会话),但在非正常关机之后,我预计会看到fsck的结果(因为关机是非计划性的)。
然而,最好的线索在于systemd日志或者journalctl。这里是我真正寻找上次关机线索的地方,也就是我期望能看到缺乏正常关机消息的地方,这意味着是硬件关机的线索(例如,由于极限温度而关闭CPU;某个引脚接地导致操作系统完全不知情,因此消息突然停止!下一条消息是下一个会话的正常启动;这样的消息会在硬件日志中找到,假设是企业服务器;消费级别的服务器通常不会保存硬件日志)。
有时候你可以在日志中看到过热的线索; 如果电源单元出现问题(PWR_GOOD下降),由于CPU甚至没有意识到关机,就什么都找不到;我怀疑硬件日志可能也会错过这种类型的关机(但是缺少条目仍然是一个线索!)
为了进一步缩小寻找的范围,这将取决于服务器的类型,正在运行的内容以及尚未提供的详细信息。