shutdown 是安全可控的关机/重启操作,支持通知、取消、服务优雅退出和 runlevel/target 切换;reboot 默认可能跳过这些步骤,仅在正常时委托给 shutdown,异常时直接调用系统调用。

shutdown 和 reboot 都能关机或重启,但行为完全不同:shutdown 是带通知、可取消、走标准流程的安全操作;reboot 默认直接调用重启逻辑,不发广播、不等服务优雅退出(除非你显式让它走 shutdown 流程)。
shutdown -r now 与 reboot 的实际差异
表面上都重启,但底层机制和影响很不一样:
-
shutdown -r now会向所有登录用户广播关机消息,冻结新登录,按顺序停止服务,再切换 runlevel 到 6,全程受 init/systemd 管控 -
reboot(无参数)在大多数现代系统上会自动委托给shutdown -r now,但若系统处于异常状态(如 systemd 卡死),它可能退化为直接调用reboot(2)系统调用,跳过服务停止步骤 -
reboot -f强制模式完全绕过 shutdown,等效于长按电源键,fsck可能被跳过,下次启动时容易报错
什么时候必须用 shutdown 而不是 reboot
当你需要控制关机节奏、留出缓冲时间、或确保他人知情时,shutdown 是唯一选择:
- 计划性维护:比如
shutdown -r +10 "DB backup in progress",提前 10 分钟通知所有人并阻止新会话 - 多人协作服务器:避免同事正传大文件时突然断连,
shutdown -k now先发警告试探响应 - 取消误操作:已执行
shutdown -h +5,发现不对?立刻shutdown -c中断,reboot没这个能力 - 指定运行级别:
shutdown -r now明确切到 runlevel 6;而裸reboot在某些 init 实现里可能行为模糊
常见错误:把 reboot 当成 shutdown 的简写
很多人图省事只记 reboot,结果踩坑:
- 在容器或 chroot 环境中直接跑
reboot,可能只重启当前命名空间,宿主机没反应,甚至卡住 -
reboot在非 root 用户下默认失败,但错误提示常是Failed to talk to init daemon,不如shutdown的权限提示明确 - 用
reboot -p关机时,部分老 BIOS 不识别-p,机器停在 halt 状态但不断电,得手动按开关——而shutdown -P now更可靠 - 脚本里混用:同一套运维脚本,有的地方写
reboot,有的写shutdown -r now,后续排查重启原因时无法统一审计
真正安全的关机/重启组合
别依赖记忆,把常用命令固化成 alias 或脚本片段:
- 立即重启(带广播):
shutdown -r now - 立即关机(断电):
shutdown -P now(比halt或poweroff更明确意图) - 5 分钟后重启并通知:
shutdown -r +5 "App deploy starting" - 取消任何 pending shutdown:
shutdown -c(注意:不是reboot -c,后者无效)
真正容易被忽略的是:runlevel 切换逻辑仍在底层起作用,哪怕你用的是 systemd。/etc/inittab 不见了,但 shutdown -r now 依然会触发 target 切换,而 reboot 可能跳过这层。这点在调试启动失败或服务残留时,会突然变得关键。











