如何查找 Linux 重启原因?

我们经常发现 Linux 系统以计划外的方式或由于未知的明显原因重新启动。 找到并解决根本原因有助于防止此类问题再次发生并避免计划外停机。

我们可以通过多种方式找出触发重启的原因。 在本文中,我们将讨论这些方法以及如何利用 Linux 系统中可用的实用程序和日志来解决此类情况。

检查重启时间

您可以使用 who 和 last 命令检查系统重启的时间

$ who -b
system boot 2021-02-13 20:51

$ last -x | head | tac
abhishek pts/0 192.168.1.16 Sat Feb 13 19:53 - 19:55 (00:02)
reboot system boot 3.10.0-1160.11.1 Sat Feb 13 19:55 - 20:54 (00:58)
runlevel (to lvl 3) 3.10.0-1160.11.1 Sat Feb 13 19:55 - 20:04 (00:08)
abhishek pts/0 192.168.1.16 Sat Feb 13 19:56 - 20:04 (00:07)
reboot system boot 3.10.0-1160.11.1 Sat Feb 13 20:04 - 20:54 (00:49)
runlevel (to lvl 3) 3.10.0-1160.11.1 Sat Feb 13 20:04 - 20:51 (00:46)
abhishek pts/0 192.168.1.16 Sat Feb 13 20:04 - 20:50 (00:46)
reboot system boot 3.10.0-1160.11.1 Sat Feb 13 20:51 - 20:54 (00:03)
runlevel (to lvl 3) 3.10.0-1160.11.1 Sat Feb 13 20:51 - 20:54 (00:02)
abhishek pts/0 192.168.1.16 Sat Feb 13 20:51 still logged in
$

检查系统消息

您可以进一步将要诊断的重启与系统消息相关联。

对于 CentOS/RHEL 系统,您将在 /var/log/messages 中找到日志,而对于 Ubuntu/Debian 系统,日志记录在 /var/log/syslog 中。 您可以简单地使用 tail 命令或您最喜欢的文本编辑器来过滤或查找特定数据。

从以下日志可以推断,此类条目表明由管理员或 root 用户启动的关机/重启。 这些消息可能因操作系统类型和重启/关机的触发方式而异,但您总能通过查看系统日志找到有用的信息,尽管它可能不够明确,无法每次都查明原因。

Feb 13 19:56:20 centos7vm chronyd[637]: Source 72.30.35.89 replaced with 142.147.92.5
Feb 13 20:00:40 centos7vm chronyd[637]: Selected source 162.159.200.123
Feb 13 20:01:01 centos7vm systemd: Created slice User Slice of root.
Feb 13 20:01:01 centos7vm systemd: Started Session 2 of user root.
Feb 13 20:04:09 centos7vm systemd-logind: System is powering down.
Feb 13 20:04:09 centos7vm systemd: Closed LVM2 poll daemon socket.
Feb 13 20:04:09 centos7vm systemd: Stopped target Multi-User System.

下面给出了一个这样的命令,您可以使用它来过滤掉系统日志:

sudo grep -iv ': starting|kernel: .*: Power Button|watching system buttons|Stopped Cleaning Up|Started Crash recovery kernel' 
  /var/log/messages /var/log/syslog /var/log/apcupsd* 
  | grep -iw 'recover[a-z]*|power[a-z]*|shut[a-z ]*down|rsyslogd|ups'

捕获的事件可能并不总是特定的。 始终追踪可能导致系统关闭/崩溃的警告或错误迹象的事件。

  如何在 Linux 上使用 at 和 batch 来调度命令

验证 auditd 日志

对于带有 auditd 的系统,这是使用 ausearch 工具检查不同事件的好地方。 使用以下命令检查审计日志中的最后两个条目。

$ sudo ausearch -i -m system_boot,system_shutdown | tail -4

这将报告最近两次关机或重新启动。 如果报告 SYSTEM_SHUTDOWN 后跟 SYSTEM_BOOT,则一切正常。 但是,如果它连续报告两条 SYSTEM_BOOT 行或仅报告一条 SYSTEM_BOOT 行,那么很可能系统没有正常关闭。 正常输出应该如下所示:

$ sudo ausearch -i -m system_boot,system_shutdown | tail -4
----
type=SYSTEM_SHUTDOWN msg=audit(Saturday 13 February 2021 A.852:8) : pid=621 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg=' comm=systemd-update-utmp exe=/usr/lib/systemd/systemd-update-utmp hostname=? addr=? terminal=? res=success'
----
type=SYSTEM_BOOT msg=audit(Saturday 13 February 2021 A.368:8) : pid=622 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg=' comm=systemd-update-utmp exe=/usr/lib/systemd/systemd-update-utmp hostname=? addr=? terminal=? res=success'
$

下面的输出列出了两个连续的 SYSTEM_BOOT 消息,尽管它需要与系统日志相关联,但它可能表示非正常关机。

$ sudo ausearch -i -m system_boot,system_shutdown | tail -4
----
type=SYSTEM_BOOT msg=audit(Saturday 13 February 2021 A.852:8) : pid=621 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg=' comm=systemd-update-utmp exe=/usr/lib/systemd/systemd-update-utmp hostname=? addr=? terminal=? res=success'
----
type=SYSTEM_BOOT msg=audit(Saturday 13 February 2021 A.368:8) : pid=622 uid=root auid=unset ses=unset subj=system_u:system_r:init_t:s0 msg=' comm=systemd-update-utmp exe=/usr/lib/systemd/systemd-update-utmp hostname=? addr=? terminal=? res=success'
$

分析systemd日志

您应该有一个持久的 systemd-journal 以便在磁盘上保留一个持久的日志,否则日志不会在重启时持续存在。 为此,您可以在 /etc/systemd/journald.conf 中进行更改或使用以下命令自行创建目录:

$ sudo mkdir /var/log/journal
$ sudo systemd-tmpfiles --create --prefix /var/log/journal 2>/dev/null
$ sudo systemctl -s SIGUSR1 kill systemd-journald

完成后,您可以选择重新启动系统以在日志中捕获多个重新启动条目,但这不是必需的。

  如何使用 Dynalist 在 Linux 中组织列表

使用以下命令列出日志中记录的引导:

$ journalctl --list-boots

这是我服务器上的输出:

$ journalctl --list-boots
-15 8a7c8034da804ebb9cb063a7553ed0bf Wed 2020-11-18 23:09:05 IST—Wed 2020-11-18 23:17:10 IST
-14 7bbb9542778a4057a91b9d22fcf91735 Wed 2020-11-18 23:17:22 IST—Wed 2020-11-18 23:20:08 IST
-13 f2ee8a61bf4c4f67a12e012855d8b1c3 Wed 2020-11-18 23:20:17 IST—Wed 2020-11-18 23:23:01 IST
-12 1277d19a959f4c33ba944a68c5874d2a Fri 2020-12-11 10:32:44 IST—Fri 2020-12-11 10:43:39 IST
-11 eb4ff97f112445888a5946d1155de1b8 Fri 2020-12-11 10:43:55 IST—Fri 2020-12-11 10:48:18 IST
-10 bf46eff3f9a344d2b28a03ffbf7fff32 Fri 2020-12-11 19:04:30 IST—Fri 2020-12-11 19:31:01 IST
 -9 2acf08368667423c89086579f98efd82 Tue 2020-12-15 17:36:52 IST—Tue 2020-12-15 19:13:10 IST
 -8 b826f223a67d454b94d4413678870f08 Sat 2020-12-19 00:31:54 IST—Sat 2020-12-19 00:44:52 IST
 -7 011e1b29339041b0ae48bbb93fce792f Wed 2020-12-23 23:01:15 IST—Wed 2020-12-23 23:02:44 IST
 -6 f41f5880572e4394938c6dcb4a8b683c Mon 2020-12-28 16:54:11 IST—Mon 2020-12-28 22:54:22 IST
 -5 a2e638dc292a4db2b0a50dd442129c28 Tue 2020-12-29 17:02:16 IST—Tue 2020-12-29 19:39:38 IST
 -4 f6c738df872a48d48daee1962727cca5 Wed 2020-12-30 19:09:30 IST—Wed 2020-12-30 19:20:23 IST
 -3 c876e60ea371460b94e247b40270b18f Thu 2020-12-31 14:36:07 IST—Thu 2020-12-31 15:45:36 IST
 -2 a23c70804ec243f7868c18737f4b7e55 Sat 2021-02-13 20:09:30 IST—Sat 2021-02-13 20:10:44 IST
 -1 94b604a6bf75462dac8c4a4576fdc863 Sat 2021-02-13 20:10:59 IST—Sat 2021-02-13 20:23:18 IST
  0 3ff7e29fa0a34878b7574b7d4d3ccfb5 Sat 2021-02-13 20:24:57 IST—Sat 2021-02-13 21:13:15 IST
$

如您所见,它列出了可以穿几双靴子。 要进一步分析特定的重启,请使用:

$ journalctl -b {num} -n

这里的 {num} 将是第一列中 journalctl –list-boots 命令中给出的索引。

$ journalctl -b -1 -n
-- Logs begin at Wed 2020-11-18 23:09:05 IST, end at Sat 2021-02-13 21:13:39 IST. --
Feb 13 20:23:18 ubuntumate20vm systemd[1]: lvm2-monitor.service: Succeeded.
Feb 13 20:23:18 ubuntumate20vm systemd[1]: Stopped Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or progress polling.
Feb 13 20:23:18 ubuntumate20vm systemd[1]: Reached target Shutdown.
Feb 13 20:23:18 ubuntumate20vm systemd[1]: Reached target Final Step.
Feb 13 20:23:18 ubuntumate20vm systemd[1]: systemd-poweroff.service: Succeeded.
Feb 13 20:23:18 ubuntumate20vm systemd[1]: Finished Power-Off.
Feb 13 20:23:18 ubuntumate20vm systemd[1]: Reached target Power-Off.
Feb 13 20:23:18 ubuntumate20vm systemd[1]: Shutting down.
Feb 13 20:23:18 ubuntumate20vm systemd-shutdown[1]: Syncing filesystems and block devices.
Feb 13 20:23:18 ubuntumate20vm systemd-journald[304]: Journal stopped
$

您可以在上面的输出中观察日志中记录的消息,并且可以追踪异常情况(如果有)。

  如何从 Linux 终端挂载和卸载存储设备

结论

使用单个命令或从单个日志文件可能无法始终查明 Linux 重新启动的原因。 因此,了解捕获系统相关事件的命令和日志总是很方便,并且可以缩短查找根本原因所需的时间。

上述示例为您提供了一个开始故障排除的起点。 结合使用此类工具和日志,您可以确信知道发生了什么以及您的系统是如何重新启动的。

接下来,找出一些Linux的轻量级监控软件。