最稳妥的生产环境重启方式是sudo shutdown -r now或sudo systemctl reboot;前者支持广播通知、延迟重启与取消,后者为systemd原生接口但不广播,二者均遵循优雅关机流程,而reboot跳过清理易致数据丢失。

sudo reboot 是最直接的重启方式,但它不提供缓冲、不通知用户、不记录详细日志——**生产环境慎用**。真正安全可靠的重启,应优先选择 sudo shutdown -r now 或 sudo systemctl reboot。
为什么 reboot 看似简单却容易出问题
这个命令本质是向 init 发送信号,跳过大部分 systemd 的优雅关闭流程。常见后果包括:
- 远程 SSH 会话突然断开,没机会发通知给其他登录用户
-
systemd不触发Before=或WantedBy=关联的清理服务(比如未 flush 的日志缓冲、未 sync 的 NFS 写缓存) - 某些依赖 orderly shutdown 的服务(如数据库、集群节点)可能残留状态或报错
- 系统日志里只有一条
reboot: System rebooted,缺乏前序 shutdown trace,排障困难
shutdown -r now 和 systemctl reboot 的实际差异
两者都走 systemd 的 reboot.target,但行为路径不同:
-
shutdown -r now:先广播Wall message(所有 TTY 显示“System going down...”),再调用systemctl start reboot.target;支持延迟(如shutdown -r +5)和取消(shutdown -c) -
systemctl reboot:直连reboot.target,不广播 Wall message,也不写 /run/nologin(即不会阻止新 login);适合脚本中调用,但不适合多用户交互场景 - 二者都会等待服务超时(默认 90s)后强制 kill,可通过
DefaultTimeoutStopSec=在/etc/systemd/system.conf中调整
重启前必须检查的三件事
不是敲完命令就完事,尤其在生产服务器上:
- 确认无关键进程在运行:
ps aux | grep -E "(mysql|postgres|redis|kubelet)" - 检查是否有用户登录:
w或who;若有人在线,用sudo shutdown -r +2给 2 分钟缓冲 - 验证磁盘状态:
df -h看根分区是否快满(/或/var占用 >90% 可能导致 reboot 过程卡在 journal 刷盘阶段)
遇到 “Failed to reboot system via logind” 怎么办
这个错误通常出现在非 root 用户执行 systemctl reboot 且未配置 polkit 权限时。解决路径很明确:
- 普通用户想免密码执行,需添加 polkit 规则:
/etc/polkit-1/rules.d/50-allow-reboot.rules,内容为:polkit.addRule(function(action, subject) { if (action.id == "org.freedesktop.login1.reboot" && subject.isInGroup("wheel")) { return polkit.Result.YES; } }); - 临时绕过:改用
sudo shutdown -r now,它不经过 logind,而是直接调用 systemd 的 manager 接口 - 注意:不要用
echo 1 > /proc/sys/kernel/sysrq+echo b > /proc/sysrq-trigger,这是强制硬重启,跳过所有 shutdown 流程,等同于拔电源
shutdown -r +1 的提前广播。


















