Shell Daily 2026-01-22: 进程猎手 (Pgrep & Pkill)

Shell Daily 2026-01-22: 进程猎手 (Pgrep & Pkill)

你是否还在用这种“祖传代码”来处理进程? ps aux | grep "java" | grep -v "grep" | awk '{print $2}' | xargs kill

这种“管道体操”不仅写起来费劲,而且极其脆弱。如果不小心匹配到了同名的其他进程(比如另一个重要的 Java 服务),后果不堪设想。Linux 早就为我们准备了专门的进程检索与信号发送工具pgreppkill

怎么用

它们能够直接通过名字用户启动参数来定位进程,无需手动解析 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 练成肌肉记忆,它是你手动清理进程时最可靠的安全网。)

posted @ 2026-01-22 13:05  Terrasse  阅读(7)  评论(0)    收藏  举报