Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux 關機與重啟指令全解析:shutdown、halt、reboot、systemctl、init 正確姿勢

編輯:關於 Linux

「關機」看似簡單,但 shutdown、halt、poweroff、reboot、systemctl、init 行為微妙不同,用錯可能導致資料遺失、服務未正確停止、檔案系統損壞。本文系統釐清各指令機制、參數、適用場景、systemd 與 SysVinit 差異、最佳實踐與自動化腳本範例。

指令對照表:核心差異一覽

指令系統調用/機制行為systemd 關聯適用場景
shutdown發送信號給 init (PID 1),切換 runlevel/target排程關機、通知所有用戶、禁止新登入、執行關機腳本systemctl poweroff / systemctl halt生產環境計畫性維護、多用戶系統
halt調用 shutdown -h 或直接 reboot(RB_HALT_SYSTEM)殺進程、sync、停止核心、不切斷電源 (視參數/ACPI)systemctl halt需進入韌體/BIOS、硬體診斷、單用戶模式
poweroffreboot(RB_POWER_OFF) (ACPI)同 halt 但切斷電源systemctl poweroff正常關機、虛擬機、實體機
rebootreboot(RB_AUTOBOOT)關機流程後重新開機systemctl reboot核心更新、硬體變更、系統卡死恢復
systemctl poweroff/halt/rebootsystemd 管理器協調單元停止、依賴排序正確停止所有服務、執行 ExecStop、同步檔案系統原生systemd 系統首選 (現代 Linux 通用)
init 0/6SysVinit 切換 runlevel舊式 runlevel 機制相容模式舊版 RHEL 6、SysVinit 容器

shutdown 參數詳解 (最完整、最安全)

shutdown [選項] [時間] [警告訊息]

選項:
  -h, --halt       關機後停止核心 (不切電,等同 halt)
  -P, --poweroff   關機後切斷電源 (預設行為,等同 poweroff)
  -r, --reboot     重新開機
  -k               只發送警告訊息,不真正關機 (演練用)
  -c               取消已排程的關機
  --no-wall        不發送廣播給所有終端機

時間格式:
  now              立即 (別用 +0,某些版本解析不同)
  +m               m 分鐘後 (如 +10)
  HH:MM            具體時間 (24小時制)
  +0               立即 (同 now,但較明確)

實戰範例

# 立即關機切電 (生產首選)
shutdown -P now "系統維護,立即關機"

# 10 分鐘後重啟,通知用戶
shutdown -r +10 "10 分鐘後重啟套用核心更新,請儲存工作"

# 23:30 定時關機
shutdown -h 23:30 "夜間備份完成後關機"

# 取消排程
shutdown -c "取消關機,維護窗口延後"

# 只發警告不關機 (演練)
shutdown -k +5 "演練:5 分鐘後假裝關機"

systemd 系統:原生指令優先

# 關機切電
systemctl poweroff

# 關機不切電 (進入韌體)
systemctl halt

# 重啟
systemctl reboot

# 進入救援模式 (單用戶)
systemctl rescue

# 進入緊急模式 (最小掛載)
systemctl emergency

# 查看關機/重啟目標
systemctl list-units --target=shutdown.target
systemctl list-units --target=reboot.target

優勢:systemd 會依據單元依賴關係、順序正確停止服務 (執行 ExecStop、ExecStopPost)、同步檔案系統、處理加密磁碟關閉、取消網路儲存掛載,避免資料損壞。

舊版 SysVinit / 相容指令

# runlevel 0 = 關機 (halt),6 = 重啟
init 0
init 6

# telinit 同 init
telinit 0
telinit 6

# 直接呼叫關機腳本 (不推薦,繞過 init)
/etc/rc.d/rc.local stop  # 不標準

參數細節:halt / poweroff / reboot

參數haltpoweroffreboot
-n不 sync (危險!)不 sync不 sync
-w只寫 wtmp 不關機只寫 wtmp只寫 wtmp
-f強制,不呼叫 shutdown (危險!)強制強制
-i關閉網路介面再關機關閉網路介面關閉網路介面
-p關機時切電 (預設)切電 (預設)-

警告:-f、-n 繞過正常關機流程,極易造成檔案系統損壞、資料庫不一致、RAID 重建。絕不可在生產環境常態使用。

虛擬機/雲端環境特殊處理

平台推薦指令說明
VMware / VirtualBox / KVM (qemu-guest-agent)systemctl poweroffAgent 會協助同步、優雅關機
AWS EC2shutdown -h now 或主控台 StopStop = 關機保留 EBS,Terminate = 刪除
GCP Compute Enginesystemctl poweroff 或 gcloud compute instances stop支援客體環境優雅關機
Azure VMsystemctl poweroff 或入口網站停止需安裝 Azure Linux Agent
Docker 容器docker stop CONTAINER (SIGTERM → 10s → SIGKILL)容器內用 trap 捕獲 SIGTERM 清理

自動化關機/重啟腳本範例

安全關機腳本 (檢查服務、同步、通知)

#!/bin/bash
# /usr/local/bin/safe-shutdown.sh
set -euo pipefail

LOG="/var/log/safe-shutdown.log"
notify() { echo "[$(date -Iseconds)] $*" | tee -a "$LOG"; }

notify "開始安全關機流程"

# 1. 檢查關鍵服務狀態
for svc in postgresql mysql nginx docker; do
    if systemctl is-active --quiet "$svc"; then
        notify "停止服務: $svc"
        systemctl stop "$svc"
    fi
done

# 2. 同步檔案系統
notify "同步檔案系統..."
sync; sync; sync

# 3. 卸載網路/加密掛載 (可選)
# umount -a -t nfs,cifs,ecryptfs 2>/dev/null || true

# 4. 執行關機
notify "執行 systemctl poweroff"
systemctl poweroff

定時重啟腳本 (配合 cron,核心更新後)

# /etc/cron.d/kernel-reboot
# 每天 03:00 檢查是否需重啟 (needs-restarting -r 來自 yum-utils/dnf-utils)
0 3 * * * root /usr/bin/needs-restarting -r || /usr/sbin/shutdown -r +5 "核心更新需重啟,5分鐘後自動重啟"

常見錯誤與迷思

  • 迷思:halt 會切電。事實:預設不切電,需 -p 或 ACPI 支援。
  • 迷思:reboot 等於 shutdown -r now。事實:reboot 在 runlevel 0/6 才直接重啟,否則呼叫 shutdown -r (systemd 下同)。
  • 錯誤:直接拔電源/強制關機虛擬機。後果:檔案系統髒標記、資料庫崩潰、快照不一致。
  • 錯誤:用 kill -9 1 殺 init。後果:核心恐慌、立即重啟/停機,零清理。

最佳實踐總結

  1. systemd 系統:永遠用 systemctl poweroff/reboot/halt。
  2. 需排程/通知:用 shutdown -P/+m/HH:MM "msg"。
  3. 腳本自動化:呼叫 systemctl,前置檢查服務停止、同步、卸載。
  4. 避免:-f、-n、kill -9 1、直接斷電。
  5. 虛擬機/雲端:優先用平台原生 Stop/Reboot API,確保客體代理協同。

正確的關機/重啟,是系統穩定、資料完整的最後一道防線。養成「先通知、再停止服務、後同步、最後 systemctl」的習慣,讓每一次重啟都安心無虞。

Copyright © Windows教程網 All Rights Reserved