在 Linux 系統管理中,kill 是終止失控進程的核心工具。但許多人只會 kill -9,忽略了信號機制的優雅關閉流程,導致資料遺失、資源洩漏。本文系統講解信號分類、指令語法、查找 PID 技巧與生產環境最佳實踐。
kill 本質是「發送信號給進程」,而非直接殺死。Linux 定義 60+ 信號 (kill -l 查看),核心兩類:
| 信號 | 編號 | 行為 | 可被忽略/捕捉 | 適用場景 |
|---|---|---|---|---|
SIGTERM | 15 | 請求正常終止 | ✅ 是 (預設處理:退出) | 標準關閉流程:存檔、釋放鎖、關閉連線 |
SIGKILL | 9 | 強制立即終止 | ❌ 否 (核心直接回收資源) | 進程無回應、死鎖、必須立即釋放資源 |
SIGINT | 2 | 終端中斷 (Ctrl+C) | ✅ 是 | 前台互動程式 |
SIGHUP | 1 | 終端掛斷 | ✅ 是 | 守護進程重載設定 (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=存在) |
# 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 解決一切" → ✅ 會導致資料庫損壞、暫存檔殘留、鎖未釋放、子進程變孤兒。init (PID 1)、核心執行緒 ([kthreadd]) 等特殊進程不可殺。掌握信號語義與漸進式終止策略,是 Linux 運維從「會用指令」進階到「可靠交付」的關鍵分水嶺。