Linux命令-shutdown(安全关闭或重启系统)
-
- [🔰 简介](#🔰 简介)
- [📖 语法](#📖 语法)
- [⚙️ 选项](#⚙️ 选项)
- [💡 实战示例](#💡 实战示例)
-
- [示例 1:立即关机与重启(最常用)](#示例 1:立即关机与重启(最常用))
- [示例 2:定时关机与广播消息](#示例 2:定时关机与广播消息)
- [示例 3:取消已计划的关机](#示例 3:取消已计划的关机)
- [示例 4:与其他命令组合(先停止服务再关机)](#示例 4:与其他命令组合(先停止服务再关机))
- [示例 5:远程服务器的安全重启流程](#示例 5:远程服务器的安全重启流程)
- [示例 6:日志分析 - shutdown 记录](#示例 6:日志分析 - shutdown 记录)
- [示例 7:危险操作提醒 - 错误做法 vs 正确做法](#示例 7:危险操作提醒 - 错误做法 vs 正确做法)
- [⚠️ 注意事项](#⚠️ 注意事项)
- [📝 总结](#📝 总结)
- [📚 相关命令](#📚 相关命令)
快速参考 shutdown 是 Linux 系统中最安全、最推荐 的关机/重启命令。它会在预定时间向所有登录用户广播通知消息 ,正确停止所有运行中的服务(发送 SIGTERM、等待、再 SIGKILL),同步磁盘缓存,卸载网络文件系统,最终调用底层 halt/poweroff/reboot。生产环境永远不要直接拔电源或 kill -9 1,应优先使用 shutdown。
关键约束:
shutdown需要 root 权限 (普通用户调用会被拒绝)。shutdown本质是触发 systemd 的poweroff.target/reboot.target。
🔰 简介
| 项目 | 说明 |
|---|---|
| 命令位置 | /usr/sbin/shutdown(util-linux) |
| 权限要求 | 必须 root |
| 行为 | 通过 systemd/init 调度关机/重启流程 |
| 广播消息 | 所有登录用户立刻收到 wall 通知 |
| 优雅停止 | 发送 SIGTERM → 等待 → SIGKILL |
| 时间调度 | 立即、定时(+n)、精确(HH:MM)、取消 |
| 配置文件 | /etc/shutdown.allow(允许非 root 取消关机,Debian 系) |
| 与 systemctl 关系 | shutdown 内部调用 systemctl poweroff 等 |
| 现代替代 | systemctl poweroff / systemctl reboot |
shutdown vs poweroff vs halt vs reboot 区别:
| 命令 | 行为 | 是否触发 systemd 流程 |
|---|---|---|
shutdown -h now |
安全关机(断电) | ✅ |
shutdown -r now |
安全重启 | ✅ |
poweroff |
关机(断电) | ✅ |
halt |
停机(不切断电源,老内核行为) | ✅ |
reboot |
重启 | ✅ |
systemctl poweroff |
等价 shutdown -h | ✅ |
init 0 |
关机 | ✅ |
init 6 |
重启 | ✅ |
生产规范:云主机上==
shutdown是首选 ==,避免直接reboot(部分云平台 reboot 不通知 ACPI)。
📖 语法
bash
shutdown [选项] 时间 [警告消息...]
时间参数(time):
| 格式 | 含义 | 示例 |
|---|---|---|
now |
立即执行(等价 +0) | shutdown -h now |
+m |
m 分钟后 | shutdown -r +10 |
HH:MM |
24 小时制精确时间 | shutdown -h 23:00 |
+0 |
1 分钟后 | shutdown -h +0 |
| 空 | 默认为 +1(1 分钟后) |
shutdown -h 会在 1 分钟后执行 |
⚙️ 选项
| 选项 | 简写 | 说明 |
|---|---|---|
--halt |
-h |
停机(可能不切断电源,配合 -P 强制断电) |
--poweroff |
-P |
明确断电(默认行为) |
--reboot |
-r |
重启 |
--kmsg |
-k |
仅发警告不执行(测试广播用) |
--no-wall |
不发广播消息(不推荐) | |
--cancel |
-c |
取消已计划的关机/重启 |
--force |
-f |
强制执行(跳过 fsck 强制日志) |
--time |
-t SEC |
在 kill 前等待 SEC 秒(默认 5) |
-a |
配合 /etc/shutdown.allow 允许普通用户取消关机(Debian 系) |
|
--help |
帮助 | |
--version |
版本 |
💡 实战示例
示例 1:立即关机与重启(最常用)
bash
# ========== 立即关机(断电) ==========
$ sudo shutdown -h now
# 或
$ sudo shutdown -P now
# 或
$ sudo shutdown 0
# ========== 立即重启 ==========
$ sudo shutdown -r now
# 等价
$ sudo reboot
# 等价
$ sudo systemctl reboot
# 查看当前广播消息(其他用户能看到)
$ wall
Broadcast message from root@web01 (pts/0) (Mon Jan 15 14:30:00 2024):
The system is going down for system halt at Mon Jan 15 14:30:00 2024
注意:
shutdown没有输出"已开始关机"的提示,真正的执行是 1 分钟后(默认 +1 行为安全设计)。如果想立即执行,必须now或+0。
示例 2:定时关机与广播消息
bash
# ========== 场景 1:10 分钟后重启,并告知原因 ==========
$ sudo shutdown -r +10 "系统内核升级维护,预计 15 分钟后恢复"
# 用户收到:
# The system is going down for reboot at Mon 2024-01-15 14:40:00 CST!
# The system is going down for reboot at Mon 2024-01-15 14:40:00 CST! (multiple messages omitted)
# 系统内核升级维护,预计 15 分钟后恢复
# ========== 场景 2:凌晨 3 点精确关机 ==========
$ sudo shutdown -h 03:00 "夜间断电维护,请保存工作"
# 系统将在 03:00 整点执行
# ========== 场景 3:测试广播(不真正关机) ==========
$ sudo shutdown -k +5 "** 演练 ** 5 分钟后关机(实际不执行)"
# 用户收到消息,但不会真的关机
Broadcast message from root@web01 (pts/0):
** 演练 ** 5 分钟后关机(实际不执行)
# 5 分钟后系统正常,不会停机
# 这是 -k 选项的精髓:用于**测试通知流程**
# ========== 场景 4:30 分钟后关机 ==========
$ sudo shutdown -h +30
Shutdown scheduled for Mon 2024-01-15 15:00:00 CST, use 'shutdown -c' to cancel.
看到
Shutdown scheduled for ...是正常反馈。shutdown会创建/run/systemd/shutdown/scheduled文件,systemd 据此调度。
示例 3:取消已计划的关机
bash
# 假设 10 分钟前设置了 1 小时后重启
$ sudo shutdown -r +60 "数据库升级"
Shutdown scheduled for Mon 2024-01-15 15:30:00 CST, use 'shutdown -c' to cancel.
# 突然要取消(用户反馈业务不能停)
$ sudo shutdown -c "维护取消,系统继续运行"
# 用户收到:
# The system shutdown has been cancelled! System will continue to run.
# 维护取消,系统继续运行
# 验证:检查 /run/systemd/shutdown/scheduled 是否消失
$ ls /run/systemd/shutdown/ 2>/dev/null
# 空
# 验证计划文件
$ cat /run/systemd/shutdown/scheduled 2>/dev/null
# 应该报 No such file or directory
小技巧:取消时必须带消息 (
-c后跟字符串),否则用户看到的是"未知原因取消",容易引起疑虑。
示例 4:与其他命令组合(先停止服务再关机)
bash
# 场景:维护性关机,希望先 dump 数据库再停机
# 利用 -t 延长 kill 等待时间,给服务充分停止时间
$ sudo systemctl stop nginx
$ sudo systemctl stop mysqld
$ sudo mysqldump --all-databases > /backup/db_$(date +%F).sql
$ sudo shutdown -h -t 30 +5 "备份完成,5 分钟后停机维护"
# -t 30:systemd 在发送 SIGKILL 前会等 30 秒
# +5:5 分钟后开始
注意:默认
shutdown在 kill 进程前只等 5 秒(-t 5),对 MySQL、Elasticsearch 这类慢服务可能强杀导致数据损坏 ,生产环境必须先用systemctl stop优雅停止。
示例 5:远程服务器的安全重启流程
bash
# 1. 在跳板机/堡垒机上先 SSH 到目标机器
$ ssh admin@web01
# 2. 检查是否有用户在线(避免突然断连)
$ who
root pts/0 2024-01-15 14:00 (192.168.1.5)
deploy pts/1 2024-01-15 14:20 (192.168.1.6)
# 3. **先通知**(用 wall 或写消息)
$ wall "系统将在 10 分钟后重启,请保存工作并退出"
# 用户会看到:
# Broadcast message from root@web01 (pts/0):
# 系统将在 10 分钟后重启,请保存工作并退出
# 4. 关闭新登录(防止重启期间有人上来)
$ sudo systemctl stop sshd # 或 sudo systemctl stop ssh
# 注意:此操作会让你的 SSH 也断开!
# 所以更安全的做法是:
# -t 1 # 不接受新登录(修改 sshd 配置文件)
# 或通过防火墙临时禁外网
# $ sudo iptables -A INPUT -p tcp --dport 22 -j DROP
# 5. 计划重启
$ sudo shutdown -r +10 "系统内核升级"
# 立刻断 SSH,但 shutdown 计划已生效,10 分钟后会重启
# 6. 等待并验证
# (重新连接)
$ ssh admin@web01
$ uptime
14:35:00 up 5 min, 1 user, load average: 0.20, 0.15, 0.10
# 确认已重启
示例 6:日志分析 - shutdown 记录
bash
# 每次 shutdown/reboot 都会在多个位置留痕
# 1. /var/log/wtmp(登录记录,reboot 是"伪登录")
$ last reboot | head -5
reboot system boot 3.10.0-1160.el7 Mon Jan 15 14:25 still running
reboot system boot 3.10.0-1160.el7 Sun Jan 14 09:00 - 14:25 (05:25)
reboot system boot 3.10.0-1160.el7 Sat Jan 13 09:00 - 09:00 (00:00)
# 2. journald 记录
$ journalctl --list-boots | tail -5
-5 2024-01-11 09:00:00 2024-01-11 18:00:00
-4 2024-01-12 09:00:00 2024-01-12 18:00:00
-3 2024-01-13 09:00:00 2024-01-13 18:00:00
-2 2024-01-14 09:00:00 2024-01-14 18:00:00
-1 2024-01-15 09:00:00 2024-01-15 14:25:00
# 3. /var/log/messages 或 /var/log/syslog
$ grep -i "shutdown\|reboot\|halt" /var/log/messages | tail -10
Jan 15 14:25:01 web01 systemd-logind: System is rebooting.
Jan 15 14:25:01 web01 systemd[1]: Stopping target Multi-User System.
Jan 15 14:25:02 web01 systemd[1]: Stopped target Multi-User System.
Jan 15 14:25:02 web01 systemd[1]: Stopping LVM2 mirror log daemon...
Jan 15 14:25:02 web01 rsyslogd: [origin software="rsyslogd" swVersion="8.2102.0"] exiting on signal 15.
# 4. last -x(系统事件 + 关机)
$ last -x | head -10
root pts/0 192.168.1.5 Mon Jan 15 14:00 still logged in
run-level (to lvl 5) 3.10.0-1160.el7 Mon Jan 15 14:25 - 14:25 (00:00)
shutdown system down 3.10.0-1160.el7 Mon Jan 15 14:25 - 14:25 (00:00)
reboot system boot 3.10.0-1160.el7 Mon Jan 15 14:25 still running
示例 7:危险操作提醒 - 错误做法 vs 正确做法
bash
# ❌ 错误做法 1:直接拔电源
# 后果:文件系统损坏,数据库无法启动
# 适用:物理机房火灾时(如果能挽救数据)
# ❌ 错误做法 2:远程 kill -9 1(向 init 进程发 SIGKILL)
$ sudo kill -9 1
# 后果:systemd 直接死亡,所有子进程失去父进程,文件系统未同步
# 99% 的情况下**会丢数据**且**无法远程恢复**
# ❌ 错误做法 3:在 MySQL 还在写入时直接 reboot
$ sudo reboot
# 后果:MySQL 数据文件可能损坏
# ✅ 正确做法 1:标准停机
$ sudo shutdown -h now
# ✅ 正确做法 2:先停服务再停机(标准 SOP)
$ sudo systemctl stop mysqld
$ sudo systemctl stop nginx
$ sudo sync # 强制刷写磁盘缓存
$ sudo shutdown -h now
# ✅ 正确做法 3:关键数据库服务器关机
$ sudo systemctl stop mysqld # 触发 slow shutdown,写入 binlog position
$ sudo systemctl stop redis # 触发 RDB 持久化
$ sudo sync
$ sudo shutdown -h +5 "已通知用户,5 分钟后停机"
⚠️ 注意事项
1. 需要 root 权限
bash$ shutdown -h now Failed to set wall message, ignoring: Access denied加
sudo,或su -切换到 root。
2. 时间参数留出缓冲不要
shutdown -h +0在 SSH 上远程 执行------可能你还没断开就会执行(虽然有 1 分钟默认值,但+0表示立即)。生产环境建议 +5 以上。
3. 取消只能用 -c计划好的 shutdown 不能用 Ctrl+C 取消 ,必须
shutdown -c "原因"。
4. SSH 断开问题一旦
shutdown真正开始执行,SSH 会立刻断 (systemd 停止 sshd 服务)。确保你有物理/KVM/IPMI/带外管理通道用于救场。
5. 云主机的特殊行为
- AWS EC2 / Azure VM 关机后 = 停止(云厂商控制台显示"Stopped"),账单照常(部分厂商不收停机费)
- 阿里云 ECS:shutdown 后状态为"已停止",磁盘保留
- 容器/VM(K8s Pod):shutdown 会让 Pod 退出并被重启,不是真正关机
6. 集群中的 shutdown任何集群(Hadoop、K8s、MySQL MGR、Redis Cluster)不能直接 shutdown 节点 ,必须先 drain / 驱逐:
bash# K8s:先 cordon + drain kubectl cordon node01 kubectl drain node01 --ignore-daemonsets --delete-emptydir-data ssh node01 'sudo shutdown -h +5'
7. shutdown 与 systemctl 嵌套
shutdown→ 内部调用systemctl→ systemd 调度关机流程- 容器内 shutdown 实际调用 systemd-shutdownd 或仅发信号(容器无真关机)
8. 时区影响
shutdown 03:00是本地时间 (取决于TZ环境变量或/etc/localtime)。服务器建议用 UTC,date -u查看。
📝 总结
shutdown 是 Linux 关机的"金标准"------安全、可控、可调度、可取消。本节要点:
- 最常用三连 :
shutdown -h now(关机)、shutdown -r now(重启)、shutdown -c(取消) - 关键参数 :
now(立即)、+n(n 分钟后)、HH:MM(精确时刻)、-k(仅警告) - 安全规范 :① 先通知(wall/IM);② 先
systemctl stop关键服务;③sync刷盘;④ 留缓冲时间 - 必须用 root,权限不足会拒绝执行
- 生产禁术 :拔电源、
kill -9 1、未停数据库直接reboot - 集群环境 :先 drain/驱逐,不能直接 shutdown 节点
最终建议 :生产环境 永远用
shutdown,==运维脚本 == 用systemctl poweroff/reboot(更明确),==测试广播 == 用shutdown -k +5验证通知流程。
📚 相关命令
| 命令 | 用途 |
|---|---|
systemctl poweroff |
systemd 关机(等价 shutdown -h now) |
systemctl reboot |
systemd 重启 |
systemctl halt |
停机(不切断电源) |
halt |
立即停机(不推荐) |
poweroff |
立即断电(不推荐) |
reboot |
立即重启(不推荐) |
init 0 / init 6 |
切换运行级别 |
wall |
广播消息给所有登录用户 |
sync |
强制刷写磁盘缓存 |
last -x |
查看历史关机/启动记录 |
journalctl --list-boots |
systemd 启动会话列表 |