kill 與 killall 看似簡單,實則暗藏「進程名稱識別機制差異」導致誤殺/漏殺風險。本文通過 Perl 腳本實測,揭示 /proc/PID/stat 中進程名稱判定邏輯,建立安全用殺流程。
| 啟動方式 | ps 顯示命令行 | /proc/PID/stat 進程名 (第2欄) | killall 能殺的名稱 |
|---|---|---|---|
./script.pl | /usr/bin/perl -w /path/script.pl | (script.pl) | script.pl ✓ / perl ✗ |
perl script.pl | /usr/bin/perl -w /path/script.pl | (perl) | perl ✓ / script.pl ✗ |
關鍵發現:ps 顯示的「命令行」相同,但 /proc/PID/stat 記錄的「進程名稱」不同——OS 記錄的是「啟動程式」而非「命令行首個詞」。
# /proc/12242/stat 片段
12242 (script.pl) S 3102 ...
# cmdline: /usr/bin/perl -w /home/.../script.pl
# /proc/13372/stat 片段
13372 (perl) S 3102 ...
# cmdline: /usr/bin/perl -w /home/.../script.pl
/proc/*/stat 第 2 欄 (括號內的進程名)killall script.pl 只殺第一種啟動方式;killall perl 只殺第二種kill -TERM $(pgrep -f 'exact_pattern')
# 或
pkill -f 'exact_pattern' # 針對完整命令行匹配
ps -ef | grep pattern 確認命令行ps -eo pid,comm,args | grep pattern 確認 comm 欄位 (即 stat 進程名)comm 值作為 killall 參數/usr/bin/perl script.pl 或 ./script.pl (需 shebang + 執行權限)ps axfww # 完整進程樹
ps uxfww # 用戶導向樹
| 信號 | 值 | 用途 | 是否可捕獲 |
|---|---|---|---|
| SIGTERM (15) | 15 | 優雅關閉 (預設) | 是 |
| SIGINT (2) | 2 | 終端中斷 (Ctrl+C) | 是 |
| SIGKILL (9) | 9 | 強制殺死 (最後手段) | 否 |
| SIGHUP (1) | 1 | 掛起/重讀配置 | 是 |