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 kill 指令完全指南:信號機制、常用參數與進程終止最佳實踐

編輯:關於 Linux

在 Linux 系統管理中,kill 是終止失控進程的核心工具。但許多人只會 kill -9,忽略了信號機制的優雅關閉流程,導致資料遺失、資源洩漏。本文系統講解信號分類、指令語法、查找 PID 技巧與生產環境最佳實踐。

一、信號機制核心觀念

kill 本質是「發送信號給進程」,而非直接殺死。Linux 定義 60+ 信號 (kill -l 查看),核心兩類:

信號編號行為可被忽略/捕捉適用場景
SIGTERM15請求正常終止✅ 是 (預設處理:退出)標準關閉流程:存檔、釋放鎖、關閉連線
SIGKILL9強制立即終止❌ 否 (核心直接回收資源)進程無回應、死鎖、必須立即釋放資源
SIGINT2終端中斷 (Ctrl+C)✅ 是前台互動程式
SIGHUP1終端掛斷✅ 是守護進程重載設定 (nginx -s reload)

黃金法則:永遠先嘗試 SIGTERM (預設),給予進程 5~30 秒優雅關閉時間;無回應才升級 SIGKILL。

二、指令語法與常用變體

kill [信號|選項] PID...

常用形式:

指令效果
kill PID發送 SIGTERM (15),優雅關閉
kill -15 PID同上,明確指定
kill -9 PID發送 SIGKILL (9),強制殺死
kill -s SIGTERM PID使用信號名稱,可讀性佳
kill -l列出所有信號名稱與編號
kill -0 PID不發送信號,僅檢查進程是否存在/權限 (返回值 0=存在)

三、查找目標 PID 技巧

# 1. 精確查找進程名 (推薦)
pgrep -f "process_name"
pidof process_name

# 2. 完整資訊 (含參數、用戶、CPU/MEM)
ps aux | grep process_name
ps -ef | grep process_name

# 3. 互動式篩選 (需安裝)
htop
fkill  # npm install -g fkill-cli

避坑:grep 本身會出現在 ps aux | grep 結果中,建議用 grep -v grep 或 pgrep。

四、批次終止同名進程

# 方法 1: pkill (按名稱發送信號)
pkill -9 firefox
pkill -u username  # 殺掉該用戶所有進程 (慎用!)

# 方法 2: killall (需確切進程名)
killall -9 chrome

# 方法 3: xargs 組合
pgrep firefox | xargs kill -9

五、生產環境最佳實踐腳本

#!/bin/bash
# graceful_kill.sh: 先 SIGTERM 等待,再 SIGKILL
PID=$1
TIMEOUT=15

if [ -z "$PID" ]; then
    echo "Usage: $0 "
    exit 1
fi

if ! kill -0 "$PID" 2>/dev/null; then
    echo "Process $PID not found."
    exit 0
fi

echo "Sending SIGTERM to $PID..."
kill -15 "$PID"

for i in $(seq 1 $TIMEOUT); do
    if ! kill -0 "$PID" 2>/dev/null; then
        echo "Process terminated gracefully."
        exit 0
    fi
    sleep 1
done

echo "Timeout reached. Sending SIGKILL..."
kill -9 "$PID"
sleep 1
if kill -0 "$PID" 2>/dev/null; then
    echo "ERROR: Process $PID still alive!"
    exit 1
fi
echo "Process forcefully killed."

六、常見誤區

  • ❌ "kill -9 解決一切" → ✅ 會導致資料庫損壞、暫存檔殘留、鎖未釋放、子進程變孤兒。
  • ❌ "PID 不變" → ✅ 進程重啟後 PID 改變,腳本勿硬編碼 PID。
  • ❌ "root 可殺任何進程" → ✅ init (PID 1)、核心執行緒 ([kthreadd]) 等特殊進程不可殺。

掌握信號語義與漸進式終止策略,是 Linux 運維從「會用指令」進階到「可靠交付」的關鍵分水嶺。

Copyright © Windows教程網 All Rights Reserved