Linux_用 `ps` 按进程名过滤线程,以及用 `pkill` 按进程名安全杀进程
用 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 <进程名>
把 <进程名>
换成你的真实进程即可,祝调试愉快!