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. 练习#
- 启动一个后台进程并查看父子关系
# 启动一个后台进程
sleep 300 &
echo "PID=$!"
pstree -s -p $!
- 通过关键字查找并终止
# 查找 sleep 进程
pgrep -af "sleep 300"
# 温和终止
pkill -15 -f "sleep 300"