前言
Linux 中終止進程不僅是「強制關閉」,更涉及信號機制、進程組、圖形介面等多維度。本文系統整理 kill、killall、pkill、xkill 四大指令,並深入解析信號種類、特殊用法與最佳實務。
一、核心指令對照表
| 指令 | 匹配方式 | 典型用法 | 適用場景 |
kill | PID | kill -9 1234 | 精確終止單一進程 |
killall | 進程名稱 (精確) | killall firefox | 依名稱終止所有同名進程 |
pkill | 進程名稱 (模式) | pkill -f "python.*script.py" | 模式匹配、支援使用者/終端機過濾 |
xkill | 視窗點擊 | xkill → 點擊視窗 | 圖形介面掛死視窗急救 |
二、kill 指令詳細用法
1. 基本語法
kill [信號] PID...
2. 常用信號
| 信號編號/名稱 | 用途 | 特性 |
1 / SIGHUP | 掛起/重讀配置 | 常用於 daemon 重載設定 |
2 / SIGINT | 中斷 (Ctrl+C) | 可被程式捕捉處理 |
9 / SIGKILL | 強制終止 | 不可捕捉/忽略/阻塞,立即結束,不執行清理 |
15 / SIGTERM | 正常終止 (預設) | 可被捕捉,程式可釋放資源、存檔後退出 |
17/19/23 / SIGSTOP | 暫停進程 | 不可捕捉,進程凍結 |
18/19/25 / SIGCONT | 繼續暫停的進程 | 配合 SIGSTOP 使用 |
3. 實戰範例
# 1. 正常關閉 (給程式機會收尾)
kill 1234
# 等同 kill -15 1234
# 2. 強制殺掉 (頑固進程)
kill -9 1234
# 3. 暫停/繼續 (除錯用)
kill -STOP 1234
kill -CONT 1234
# 4. 終止當前使用者所有進程 (極度危險!)
kill -9 -1
# 5. 結合 pgrep 批次殺掉
kill -9 $(pgrep firefox)
三、killall 指令
語法
killall [-選項] 進程名稱...
關鍵選項
| 選項 | 說明 |
-e | 精確匹配長名稱 (超過 15 字元時避免誤殺) |
-i | 互動模式,逐一確認 |
-g | 殺掉整個進程組 |
-w | 等待進程真正結束 (可能永久阻塞) |
-q | 靜默模式,無匹配不報錯 |
-v | 顯示信號是否發送成功 |
-I | 忽略大小寫 |
範例
killall firefox
killall -9 -e chromium-browser
killall -u www-data # 殺掉 www-data 使用者的所有進程
四、pkill 指令 (更強大的模式匹配)
語法
pkill [選項] 模式
獨特優勢
- 支援完整命令列模式匹配 (
-f)
- 可依終端機 (
-t)、使用者 (-u)、群組 (-G) 過濾
- 可針對最新/最舊進程 (
-n/-o)
範例
pkill firefox
pkill -f "python.*manage.py runserver"
pkill -u nginx
pkill -t pts/2
pkill -n sshd # 只殺最新啟動的 sshd
五、xkill:圖形介面急救神器
xkill
# 滑鼠游標變成「X」或骷髏圖示
# 點擊任意視窗 → 該視窗所屬進程的 X 連線被切斷 → 視窗關閉
# 右鍵取消
適用於 Firefox、LibreOffice 等 GUI 程式假死無法正常關閉時。
六、進程查找輔助指令
| 指令 | 用途 |
ps aux | grep 關鍵字 | 經典查找 |
pgrep -l 關鍵字 | 輸出 PID + 名稱 |
pidof 程式名 | 僅輸出 PID |
top / htop | 互動式查看 |
七、最佳實務建議
- 優先用 SIGTERM (15):給程式釋放鎖、存檔、關閉連線的機會。
- SIGKILL (9) 為最後手段:可能導致資料損毀、鎖殘留、子進程變孤兒。
- 生產環境避免
kill -9 -1 或 killall -9:範圍過大極易誤傷。
- 配合 systemd 管理服務:
systemctl stop service 會依序發送 SIGTERM → 等待 → SIGKILL,比手動 kill 更安全。
- 使用
pkill -f 時小心模式過廣:先用 pgrep -f 預覽匹配列表。
八、killall 手冊頁節錄 (man killall)
NAME
killall - kill processes by name
SYNOPSIS
killall [-egiqvw] [-signal] name ...
killall -l
killall -V
DESCRIPTION
killall sends a signal to all processes running any of the specified commands.
If no signal is specified, SIGTERM is sent.
Signals can be specified by name (e.g. -HUP) or number (e.g. -1).
Signal 0 (check existence) can only be specified by number.
OPTIONS
-e Require exact match for very long names.
-g Kill the process group.
-i Interactive confirmation.
-l List known signal names.
-q Quiet: no complaints if no processes killed.
-v Report if signal sent.
-V Version info.
-w Wait for processes to die.
FILES
/proc location of proc filesystem
BUGS
Killing by file only works for executables kept open during execution.
Warning: killall name may not work as expected on non-Linux systems.