Shell Daily 2026-01-22: 进程猎手 (Pgrep & Pkill)
你是否还在用这种“祖传代码”来处理进程:ps aux | grep "java" | grep -v "grep" | awk '{print $2}' | xargs kill?
这种“管道体操”不仅写起来费劲,而且极其脆弱。如果不小心匹配到了同名的其他进程(比如另一个重要的 Java 服务),后果不堪设想。Linux 早就为我们准备了专门的进程检索与信号发送工具:pgrep 和 pkill。
怎么用
它们能够直接通过名字、用户或启动参数来定位进程,无需手动解析 PID。
pgrep [pattern]:查找并打印 PID。推荐常备-a参数(显示完整命令)以确认匹配无误。pkill [pattern]:找到并发送信号(默认 SIGTERM)。- 关键参数
-f**:默认只匹配进程名(如java)。加上-f后会匹配完整命令行**(如java -jar app.jar),这是区分同一类服务的关键。 - 兼容性:Linux (procps-ng) 标配。macOS 原生支持。
适用场景
- 服务重载:没有 PID 文件时,向指定服务发送 HUP 信号重载配置。
- 精准清理:只停止运行特定 Python 脚本的进程,而不影响系统其他 Python 任务。
示例 1:先确认,再动手 (Best Practice)
假设你要停止 data_worker.py。切记:先用 pgrep 确认匹配范围,避免误杀。
# 1. 错误做法:只搜 python 会匹配到系统工具
# 2. 正确做法:使用 -f 匹配参数,-a 眼见为实
$ pgrep -af "data_worker.py"
4055 python3 /opt/scripts/data_worker.py
4056 python3 /opt/scripts/data_worker_monitor.py
示例 2:发送信号
确认无误后,使用 pkill 执行操作。不需要管道,不需要 xargs。
# 场景:修改了 nginx.conf,需要热加载
# -HUP: 发送 Hang Up 信号 (相当于 reload)
$ sudo pkill -HUP nginx# 场景:踢出非法用户 guest 的所有登录会话
# -u: 严格限制用户范围
$ sudo pkill -u guest sshd
(注:把 pgrep -af 练成肌肉记忆,它是你手动清理进程时最可靠的安全网。)