上周改完内核参数,同事在群里说 reboot 一下就好了。机器重启后再也没连上,机房那边说风扇在转,屏幕停在 emergency mode。

reboot 是最省事的命令,也是最容易把人关在门外的命令。它直接触发重启,不通知登录用户,也不等你确认;shutdown -r now 会先跑一遍关机脚本,给登录用户发一条广播。两台机器的差别就在这几十秒里。

几个重启命令的实际区别

  • reboot:直接调用系统调用,服务停止顺序由 systemd 决定,快但粗
  • shutdown -r now:走正常的 target 切换,会执行 rc.local 和自己写的脚本
  • shutdown -r +5 维护重启:留五分钟,期间可以用 shutdown -c 取消
  • systemctl reboot:效果接近 shutdown,systemd 环境下更推荐

重启前该确认的三件事

一是 fstab。挂载了 NFS 或者写错 UUID,开机会卡在 emergency mode,远程只能等机房的人敲密码。二是开机自启,systemctl list-unit-files --state=enabled 看一眼,有没有多余的服务会被拉起来。三是 sync,尤其刚写完数据库文件,别让缓存里的数据跟着重启一起消失。

远程机器上还有个小技巧:用 shutdown -r +2 而不是 now。两分钟足够你发现命令打错了,还能 shutdown -c 撤回。

起不来的时候看哪里

last reboot 看最近的启动记录,uptime 判断是不是刚起来又挂。journalctl -b -1 -p err 能翻上一次启动的错误日志,注意 -1 指的是上一次 boot。systemctl --failed 列出启动失败的服务单元。真进不去系统,就在 grub 里加 single 参数进救援模式。

生产机器上,重启从来不是一条命令的事。把 fstab、grub 默认项、自启服务过一遍,比事后跑机房便宜得多。