為什麼需要正確關機
Linux 後台運行大量守護進程,數據常駐內存待寫入磁盤。強制斷電會導致:
- 文件系統損壞(journal 未提交)
- 數據庫索引損壞、數據丟失
- 系統配置文件寫入不全,下次無法啟動
- 硬件壽命縮短(磁盤未正確停轉)
關機前檢查清單
1. 觀察系統狀態
# 查看在線用戶
who
w
# 檢查網絡連接
ss -tulnp
netstat -tulnp
# 查看運行進程
ps aux --forest
systemctl list-units --state=running
# 檢查磁盤 I/O
iostat -x 1 3
iotop -o
2. 通知用戶並排程關機
# 2 分鐘後關機並廣播通知
shutdown +2 "系統將於 2 分鐘後關機進行維護,請保存工作並登出"
# 指定時間關機
shutdown 23:30 "今晚 23:30 例行維護關機"
# 取消已排程關機
shutdown -c
關機/重啟命令詳細對比
| 命令 | 作用 | 相當於 | 適用場景 |
shutdown -h now | 立即關機 | init 0 / poweroff | 標準關機,會通知用戶、執行關機腳本 |
shutdown -r now | 立即重啟 | init 6 / reboot | 標準重啟,執行關機/啟動腳本 |
shutdown +5 | 5 分鐘後關機 | - | 給用戶緩衝時間 |
halt | 停止系統(不斷電) | shutdown -h | 單用戶模式下、虛擬機調試 |
poweroff | 關機並切斷電源 | halt + ACPI | 物理機完全關閉 |
reboot | 重新啟動 | shutdown -r | 快速重啟 |
init 0 | 切換至運行級 0 | shutdown -h | SysVinit 相容模式 |
systemctl poweroff | systemd 關機 | shutdown -h | systemd 系統首選 |
systemctl reboot | systemd 重啟 | shutdown -r | systemd 系統首選 |
關鍵差異:shutdown vs halt/poweroff
- shutdown:安全關機流程 → 通知用戶 → 凍結登入 → 發送 SIGTERM → 等待進程退出 → 執行
/etc/rc0.d/ 關機腳本 → 同步磁盤 → 斷電
- halt/poweroff:直接殺死進程 → sync → 停止內核,**不執行關機腳本**,可能導致服務未正常停止(如資料庫未 checkpoint)
生產環境強制要求使用 shutdown 或 systemctl,確保服務優雅停止。
運行級別與 systemd 目標
| SysVinit 運行級 | systemd 目標 | 說明 |
| 0 | poweroff.target | 關機 |
| 1 / s / S | rescue.target | 單用戶/救援模式 |
| 2 | multi-user.target | 多用戶無網絡 |
| 3 | multi-user.target | 多用戶命令行(服務器標準) |
| 4 | - | 保留/自定義 |
| 5 | graphical.target | 圖形界面(桌面標準) |
| 6 | reboot.target | 重啟 |
切換運行級別
# SysVinit 風格(兼容)
init 3 # 切換到命令行模式
init 5 # 切換到圖形模式
# systemd 原生
systemctl isolate multi-user.target
systemctl isolate graphical.target
# 設定預設啟動目標
systemctl set-default multi-user.target
systemctl set-default graphical.target
關機流程深度解析
- 發起關機:用戶執行
shutdown 或 systemctl poweroff
- 廣播通知:所有終端顯示關機訊息,
/run/nologin 建立阻止新登入
- 發送信號:init 發送 SIGTERM 給所有進程,等待預設 90 秒
- 強制終止:超時後發送 SIGKILL 強制殺死殘留進程
- 執行關機腳本:按順序執行
/etc/rc0.d/K* 停止腳本
- 同步文件系統:
sync 將內存緩衝區刷入磁盤
- 卸載文件系統:只讀掛載根分區,卸載其他分區
- 斷電/重啟:ACPI 發送關機信號或重啟指令
緊急情況處理
系統凍結無法正常關機
# 1. 嘗試 Magic SysRq 鍵組合(需內核支援)
Alt + SysRq + R E I S U B
# R: 取消鍵盤原始模式
# E: 發送 SIGTERM
# I: 發送 SIGKILL
# S: 同步磁盤
# U: 重新掛載為只讀
# B: 重啟
# 2. 長按電源鍵 4 秒強制斷電(最後手段)
自動化關機腳本範例
#!/bin/bash
# /usr/local/bin/safe-shutdown.sh
# 安全關機:檢查關鍵服務狀態再關機
SERVICES="mysql postgresql docker nginx"
for svc in $SERVICES; do
if systemctl is-active --quiet $svc; then
echo "停止 $svc..."
systemctl stop $svc
sleep 2
fi
done
sync
shutdown -h now "維護關機完成"
總結建議
- 日常管理:**始終使用
shutdown 或 systemctl**
- 排程維護:
shutdown +10 "維護訊息" 給用戶緩衝
- 單用戶模式下可用
halt/poweroff
- 虛擬機建議安裝
qemu-guest-agent 實現客體安全關機
- 關鍵服務編寫 systemd 單元文件
ExecStopPre/ExecStop 確保優雅停止
copyright ©
萬盛學電腦網 all rights reserved