Linux_用 `ps` 按进程名过滤线程,以及用 `pkill` 按进程名安全杀进程

ps 按进程名过滤线程,以及用 pkill 按进程名安全杀进程

摘要:

  • 过滤线程信息:教你用 ps -Cpgrep+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 参数最香

bash 复制代码
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

bash 复制代码
# 正则匹配整条 cmdline
ps -Lf -p $(pgrep -d',' -f 'my.*pattern')
  • pgrep -f 支持正则,避免写复杂 awk
  • -d',' 把 PID 用逗号拼接,正好喂给 ps -p

1.3 已知 PID 只想看线程

bash 复制代码
ps -T -p 1234        # 简洁版,仅线程
ps -Lf -p 1234       # 同 -eLf 格式,但只针对 PID 1234

二、按进程名杀进程:用 pkill 优雅还是强杀?

记住口诀:pgrep 看,再 pkill

2.1 优雅终止(默认 SIGTERM)

bash 复制代码
pkill nginx
  • 默认发 SIGTERM(15),进程有机会清理资源后退出;
  • 无需手动拼 PID,一条命令搞定。

2.2 强制必杀(慎用!)

bash 复制代码
pkill -9 nginx
  • -9SIGKILL,内核直接拔电源,慎用
  • 适合进程彻底卡死、不响应 SIGTERM 的场景。

2.3 支持正则 / 整条 cmdline 匹配

bash 复制代码
pkill -f "python3 myserver.py"
  • -f 匹配 完整命令行,而不只是进程名;
  • 适合同名脚本但参数不同的场景。

2.4 先确认再杀:防误杀黄金流程

bash 复制代码
pgrep -a nginx        # 列出 PID + 完整命令行
# 检查无误
pkill nginx

2.5 老系统没有 pkill?一行兼容写法

bash 复制代码
ps -eo pid,comm | awk '$2=="nginx"{print $1}' | xargs kill -15

2.6 杀掉某用户的同名进程

bash 复制代码
pkill -u www-data nginx

三、一句话总结

  • 查线程

    精确:ps -C <进程名> -Lf

    模糊:ps -Lf -p $(pgrep -d',' -f 'pattern')

  • 杀进程

    先查:pgrep -a <进程名>

    再杀:pkill <进程名>pkill -9 <进程名>

<进程名> 换成你的真实进程即可,祝调试愉快!