4.3.3 进程树与依赖分析(pstree、pgrep、pkill)

本节聚焦进程树与依赖关系分析,掌握通过父子关系定位“谁启动了谁”、批量查找与安全终止进程的方法,适用于故障排查、资源回收与自动化运维。

文章图片

1. 进程树查看:pstree#

  • 用途:以树形结构展示进程层级,直观看到父子关系与派生链路。
  • 安装
  • Debian/Ubuntu:apt-get install -y psmisc
  • RHEL/CentOS:yum install -y psmisc
  • 常用选项与解释
  • -p 显示PID
  • -u 显示所属用户
  • -a 显示完整命令行
  • -s 显示从指定PID到root的祖先链
  • 示例(含解释与预期)
# 查看系统所有进程树(包含PID)
pstree -p

# 查看某服务的祖先链
# 解释:-s 显示从当前进程到root的完整父链
pstree -s -p 1234
# 预期:可看到 1(systemd) -> 1234(nginx)
  • 排错提示
  • 看不到进程:确认权限,使用 sudo pstree -p
  • 树形过深不清晰:结合 -a 只查看关键服务的PID链

2. 进程匹配:pgrep#

  • 用途:按名称、用户、属性批量查找进程,适合脚本化。
  • 安装
  • Debian/Ubuntu:apt-get install -y procps
  • RHEL/CentOS:yum install -y procps-ng
  • 常用选项与解释
  • -f 匹配完整命令行
  • -u <user> 指定用户
  • -l 显示PID与进程名
  • -a 显示PID与完整命令行
  • -n 取最新进程;-o 取最旧进程
  • 示例(含解释与预期)
# 查找nginx所有进程
pgrep -l nginx
# 预期:输出 PID nginx

# 查找包含关键字的命令行
pgrep -af "java.*-jar"
# 预期:输出 PID + 完整 java 命令行

# 获取最新启动的worker
pgrep -n -f "worker"
# 预期:只返回一个最新PID
  • 排错提示
  • 误匹配:改用更精准正则,如 pgrep -af "java.*myapp.jar"
  • 无输出:确认进程名,或用 ps -ef | grep 关键字 复核

3. 进程终止:pkill#

  • 用途:按规则批量终止进程,是 kill 的进程名版本。
  • 安装
  • Debian/Ubuntu:apt-get install -y procps
  • RHEL/CentOS:yum install -y procps-ng
  • 常用选项与解释
  • -f 匹配完整命令行
  • -u <user> 指定用户
  • -signal 指定信号,如 -9-15
  • 示例(含解释与预期)
# 温和停止(SIGTERM)
pkill -15 -f "java.*-jar"
# 预期:进程收到SIGTERM,优雅退出

# 强制终止(SIGKILL)
pkill -9 nginx
# 预期:nginx相关进程被立即杀死

# 仅杀某用户进程
pkill -u appuser redis
# 预期:仅appuser下的redis进程被终止
  • 排错提示
  • 进程未退出:先 pgrep -af 确认是否有多实例或守护拉起
  • 反复出现:检查systemd或crontab自动拉起策略

4. 典型排查流程(可复制执行)#

# 1) 定位进程树,确认父子关系与托管者
pstree -p

# 2) 查找匹配进程并核对命令行
pgrep -af "nginx|java.*-jar"

# 3) 温和停止并记录结果
pkill -15 -f "java.*-jar"

# 4) 复核是否清理完成
pgrep -af "java.*-jar" || echo "已清理完成"

5. 风险与最佳实践#

  • 避免使用过于宽泛的匹配模式导致误杀,优先使用 pgrep -af 先验确认
  • 关键服务建议通过systemd管理,停止/重启使用 systemctl
  • 操作前记录PID与命令行,形成审计与回滚依据

6. 练习#

  1. 启动一个后台进程并查看父子关系
# 启动一个后台进程
sleep 300 &
echo "PID=$!"
pstree -s -p $!
  1. 通过关键字查找并终止
# 查找 sleep 进程
pgrep -af "sleep 300"

# 温和终止
pkill -15 -f "sleep 300"