萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 系統優雅關機與重啟完全指南

為什麼需要正確關機

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 +55 分鐘後關機-給用戶緩衝時間
halt停止系統(不斷電)shutdown -h單用戶模式下、虛擬機調試
poweroff關機並切斷電源halt + ACPI物理機完全關閉
reboot重新啟動shutdown -r快速重啟
init 0切換至運行級 0shutdown -hSysVinit 相容模式
systemctl poweroffsystemd 關機shutdown -hsystemd 系統首選
systemctl rebootsystemd 重啟shutdown -rsystemd 系統首選

關鍵差異:shutdown vs halt/poweroff

  • shutdown:安全關機流程 → 通知用戶 → 凍結登入 → 發送 SIGTERM → 等待進程退出 → 執行 /etc/rc0.d/ 關機腳本 → 同步磁盤 → 斷電
  • halt/poweroff:直接殺死進程 → sync → 停止內核,**不執行關機腳本**,可能導致服務未正常停止(如資料庫未 checkpoint)

生產環境強制要求使用 shutdown 或 systemctl,確保服務優雅停止。

運行級別與 systemd 目標

切換運行級別

# 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

關機流程深度解析

  1. 發起關機:用戶執行 shutdown 或 systemctl poweroff
  2. 廣播通知:所有終端顯示關機訊息,/run/nologin 建立阻止新登入
  3. 發送信號:init 發送 SIGTERM 給所有進程,等待預設 90 秒
  4. 強制終止:超時後發送 SIGKILL 強制殺死殘留進程
  5. 執行關機腳本:按順序執行 /etc/rc0.d/K* 停止腳本
  6. 同步文件系統:sync 將內存緩衝區刷入磁盤
  7. 卸載文件系統:只讀掛載根分區,卸載其他分區
  8. 斷電/重啟: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
SysVinit 運行級systemd 目標說明
0poweroff.target關機
1 / s / Srescue.target單用戶/救援模式
2multi-user.target多用戶無網絡
3multi-user.target多用戶命令行(服務器標準)
4-保留/自定義
5graphical.target圖形界面(桌面標準)
6reboot.target重啟