Linux进程监控工具ps/top/htop实战指南
1. Linux进程监控的核心价值
在Linux系统管理中,进程监控就像汽车仪表盘对于驾驶员的意义。当我在生产环境第一次遇到服务异常时,通过实时查看进程状态快速定位到某个Java进程内存泄漏的场景,让我深刻体会到这项技能的重要性。现代Linux系统通常运行着数百个并发进程,从系统守护进程到用户应用,每个进程都在争夺CPU、内存和I/O资源。
实时进程监控能帮我们:
- 立即发现异常进程(如CPU占用100%的失控进程)
- 快速定位内存泄漏(观察RES内存字段的持续增长)
- 识别僵尸进程(defunct状态)
- 监控父子进程关系(特别是守护进程派生的子进程)
- 分析线程级资源占用(如Java应用的线程堆栈)
2. 基础工具三剑客:ps/top/htop详解
2.1 ps命令的实战技巧
ps是进程快照工具,就像给系统拍X光片。我最常用的组合是:
ps aux --sort=-%mem | head -10 # 内存占用TOP10 ps -ef --forest | grep -v grep # 树形显示进程关系关键字段解析:
- USER:进程所有者(突然出现的未知用户可能是入侵迹象)
- %CPU:超过100%表示使用了多核(如400%即占满4核)
- VSZ:虚拟内存大小(包含共享库)
- RSS:实际物理内存用量(排查内存泄漏看这个)
- STAT:进程状态(S=休眠,R=运行,Z=僵尸)
经验:在容器环境中,
ps auxf显示的进程树能清晰展示容器内应用与宿主机进程的关系
2.2 top命令的动态观察
top就像系统的心电图,我的常用配置流程:
- 启动后按
z开启高亮 - 按
b切换粗体显示 - 按
1展开所有CPU核心 - 按
W保存配置到~/.toprc
关键交互命令:
M:按内存排序(排查OOM时必备)P:按CPU排序(找计算密集型进程)c:显示完整命令(识别伪装进程)k:终止进程(需输入PID)H:显示线程(分析Java应用必备)
输出字段深度解读:
- load average:三个值分别代表1/5/15分钟平均负载(超过CPU核数即过载)
- %Cpu(s):us用户态、sy内核态、ni优先级、id空闲(sy过高可能内核有问题)
- KiB Mem:buffers是块设备缓存,cached是文件缓存(可用内存=free+buffers+cached)
2.3 htop的进阶用法
htop是top的增强版,安装命令:
# Ubuntu/Debian sudo apt install htop # CentOS/RHEL sudo yum install epel-release && sudo yum install htop特色功能演示:
- 鼠标点击表头排序(支持所有指标)
- 树形视图(F5切换)
- 进程标记(空格键标记后批量操作)
- 搜索过滤(F3输入关键词)
- 自定义视图(F2设置显示列)
避坑提示:在通过SSH连接时,可能遇到终端兼容性问题导致显示异常,此时需要设置:
export TERM=xterm-256color
3. 生产环境实战案例解析
3.1 Java进程内存泄漏排查
某次线上报警显示Java服务内存占用超过90%,操作流程:
top -p $(pgrep -d, java)锁定目标进程- 观察RES内存持续增长且不被GC回收
jstat -gcutil [PID] 1000查看GC情况- 发现老年代(O)占用率达99%
- 最终用
jmap -dump:format=b,file=heap.hprof [PID]导出堆分析
3.2 僵尸进程清理方案
当ps显示<defunct>状态进程时:
# 查找僵尸进程 ps -A -ostat,ppid | grep -e '[zZ]' # 获取父进程ID后向父进程发SIGCHLD kill -s SIGCHLD [PPID] # 顽固僵尸需要杀死父进程 kill -9 [PPID]3.3 隐藏进程检测技巧
入侵者常用rootkit隐藏进程,检测方法:
- 对比
ps与/proc目录内容:
ls /proc | grep -v "[a-z]" | sort -n > proc_list ps -ef | awk '{print $2}' | sort -n > ps_list diff proc_list ps_list- 使用unhide工具:
sudo apt install unhide sudo unhide proc4. 高级监控方案
4.1 系统性能快照
# 每5秒采集一次,共采集6次 vmstat 5 6 > system.log # 监控磁盘IO iostat -dx 2 5 # 网络连接统计 ss -s4.2 进程级监控脚本
实时记录某进程资源占用:
#!/bin/bash PID=$(pgrep -f "your_process_name") while true; do ps -p $PID -o %cpu,%mem,stat >> process_monitor.log sleep 5 done4.3 可视化方案
- 使用
glances工具:
pip install glances glances- 与Prometheus集成:
# 安装node_exporter wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz # 配置textfile收集器 echo 'custom_process_cpu{pid="1234"} 42.3' > /var/lib/node_exporter/textfile_collector/process_metrics.prom5. 终端异常问题解决
遇到"无法启动 conpty"错误时(常见于Windows Terminal连接Linux):
- 更新Windows Terminal到最新版
- 修改默认配置文件→高级→将"使用旧版控制台"设为是
- 或者改用更稳定的SSH客户端如MobaXterm
对于Java进程ps查不到的情况:
# 检查/proc目录 ls -l /proc/[PID]/exe # 使用jps替代 ${JAVA_HOME}/bin/jps -l