用 ps
按進程名過濾線程,以及用 pkill
按進程名安全殺進程
摘要:
- 過濾線程信息:教你用
ps -C
、pgrep+ps
等多種姿勢,既精準又避免誤殺。- 按名字殺進程:用
pkill
一把梭,優雅還是強殺隨你選,附帶“先查后殺”防誤操作。
一、ps -eLf
只想看某個進程?別再用 grep
硬拼了!
日常排查多線程程序(如 Nginx、MySQL、Java)時,我們習慣 ps -eLf
一把梭,再 grep
過濾。
但 grep
會把自己也帶出來,還要再 grep -v
,略顯笨拙。
下面給出 4 種更干凈 的做法,按場景自取。
場景 | 推薦命令 | 特點 |
---|---|---|
精確匹配命令名 | ps -C <進程名> -Lf | 自帶過濾,無 grep 污染 |
模糊/正則匹配 | ps -Lf -p $(pgrep -d',' -f 'pattern') | 支持正則,先找 PID 再查線程 |
已知 PID 查線程 | ps -T -p <PID> 或 ps -Lf -p <PID> | 只盯一個進程,輸出更短 |
最暴力萬能 | `ps -eLf | grep pattern` |
1.1 精確匹配:-C
參數最香
ps -C nginx -Lf
示例輸出:
UID PID PPID LWP C NLWP STIME TTY STAT TIME CMD
www-data 1234 1000 1234 0 5 10:11 ? Sl 0:01 nginx
www-data 1234 1000 1235 0 5 10:11 ? Sl 0:00 nginx
...
-C
直接按 命令名(不含路徑) 過濾;-Lf
保留線程信息(LWP
列即線程號);- 不會誤匹配到
grep
本身。
1.2 模糊匹配:讓 pgrep
幫你找 PID
# 正則匹配整條 cmdline
ps -Lf -p $(pgrep -d',' -f 'my.*pattern')
pgrep -f
支持正則,避免寫復雜awk
;-d','
把 PID 用逗號拼接,正好喂給ps -p
。
1.3 已知 PID 只想看線程
ps -T -p 1234 # 簡潔版,僅線程
ps -Lf -p 1234 # 同 -eLf 格式,但只針對 PID 1234
二、按進程名殺進程:用 pkill
優雅還是強殺?
記住口訣:先
pgrep
看,再pkill
殺。
2.1 優雅終止(默認 SIGTERM)
pkill nginx
- 默認發
SIGTERM
(15),進程有機會清理資源后退出; - 無需手動拼 PID,一條命令搞定。
2.2 強制必殺(慎用!)
pkill -9 nginx
-9
即SIGKILL
,內核直接拔電源,慎用;- 適合進程徹底卡死、不響應
SIGTERM
的場景。
2.3 支持正則 / 整條 cmdline 匹配
pkill -f "python3 myserver.py"
-f
匹配 完整命令行,而不只是進程名;- 適合同名腳本但參數不同的場景。
2.4 先確認再殺:防誤殺黃金流程
pgrep -a nginx # 列出 PID + 完整命令行
# 檢查無誤
pkill nginx
2.5 老系統沒有 pkill
?一行兼容寫法
ps -eo pid,comm | awk '$2=="nginx"{print $1}' | xargs kill -15
2.6 殺掉某用戶的同名進程
pkill -u www-data nginx
三、一句話總結
-
查線程
精確:ps -C <進程名> -Lf
模糊:ps -Lf -p $(pgrep -d',' -f 'pattern')
-
殺進程
先查:pgrep -a <進程名>
再殺:pkill <進程名>
或pkill -9 <進程名>
把 <進程名>
換成你的真實進程即可,祝調試愉快!