作为 Linux 运维或开发人员,进程监控是日常工作中不可或缺的技能。本文系统梳理 ps、htop、lsof 三大核心命令,从基础用法到高级技巧,帮你建立完整的进程监控知识体系。一、ps —— 进程查看的基石
ps(Process Status)是 Linux 中最基本也最强大的进程查看命令。它能告诉你:当前有哪些进程在运行、运行状态如何、是否存在僵尸进程、哪些进程占用了过多资源等。
1.1 基本语法
ps [选项]
1.2 核心参数速查
| 参数 | 作用 |
|---|
-A / -e | 显示所有进程 |
-a | 显示当前终端的所有进程(除会话引线) |
-x | 显示没有控制终端的进程 |
-u | 按用户筛选进程 |
-f | 全格式输出,通常与其他选项联用 |
-l | 长格式输出(含 F、wchan、C 等字段) |
-p | 按 PID 筛选 |
-o | 自定义输出列 |
-H | 以层次结构显示进程树 |
-L | 显示线程信息 |
-m | 显示所有线程 |
1.3 读懂 ps aux 输出
执行 ps aux 后,每一列的含义如下:
| 列名 | 含义 |
|---|
| USER | 进程所属用户 |
| PID | 进程 ID |
| %CPU | CPU 使用率 |
| %MEM | 物理内存使用率 |
| VSZ | 虚拟内存使用量(KB) |
| RSS | 常驻内存使用量(KB) |
| TTY | 所在终端,? 表示与终端无关 |
| STAT | 进程状态(见下方状态说明) |
| START | 进程启动时间 |
| TIME | 累计 CPU 使用时间 |
| COMMAND | 启动命令 |
进程状态(STAT)详解:
| 状态码 | 含义 |
|---|
R | Running,正在运行或可运行 |
S | Sleeping,可中断睡眠,等待信号唤醒 |
D | 不可中断睡眠,通常在等待 I/O |
T | Stopped,已停止或被追踪 |
Z | Zombie,僵尸进程,已终止但父进程未回收 |
I | Idle,空闲内核线程(内核 4.14+) |
补充: STAT 列还可能附带修饰符,如 <(高优先级)、N(低优先级)、s(会话首进程)、l(多线程)、+(前台进程组)。
1.4 进程树与线程栈
pstree —— 以树状结构查看进程关系:
pstree -p grafana # 以 grafana 用户查看进程树,-p 显示 PID
pstack —— 查看进程/线程的调用栈:
pstack <pid> # 输出指定进程的栈跟踪信息
多线程情况下,pstack 会分别显示每个线程的栈信息,这在排查死锁和性能问题时非常有用。
1.5 高频实战命令
# 查看所有 Java 进程ps aux | grep java# 显示某进程的所有线程ps -p <pid> -L# 自定义显示列ps -e -o pid,uname,pcpu,pmem,comm# 查看进程启动时间和运行时长ps -eo pid,lstart,etime | grep <pid># 按内存排序(降序)ps aux --sort=-rss# 按 CPU 排序(降序)ps aux --sort=-%cpu# 查看进程堆栈pstack <pid># 查看指定进程下的线程 ID 和 CPU 占用ps -eLo pid,lwp,pcpu | grep <pid>
二、htop —— 交互式进程监控神器
htop 是 top 的增强版,提供彩色界面、鼠标支持、横向/纵向滚动,体验远优于传统 top。
2.1 安装
# CentOS / RHELyum -y install epel-release htop# Ubuntu / Debianapt install htop# macOSbrew install htop
2.2 参数说明
| 参数 | 作用 |
|---|
-C | 单色模式 |
-d <秒> | 设置刷新间隔 |
-u <用户> | 只显示指定用户的进程 |
-p <PID> | 只显示指定 PID |
-s <列名> | 按指定列排序 |
-t | 以树状视图显示 |
2.3 界面四大区域
启动 htop 后,界面自上而下分为四个区域:
| 区域 | 内容 |
|---|
| 区域 1 | CPU 各核使用率、内存及 Swap 使用率(进度条) |
| 区域 2 | 任务数、负载均值(1/5/15 分钟)、系统运行时间 |
| 区域 3 | 进程列表(核心工作区) |
| 区域 4 | 底部功能键提示(F1-F10) |
2.4 进程列表字段说明
| 字段 | 含义 |
|---|
| PID | 进程 ID |
| USER | 进程所有者 |
| PR | 优先级 |
| NI | Nice 值(负值=高优先级) |
| VIRT | 虚拟内存 |
| RES | 常驻物理内存 |
| SHR | 共享内存 |
| S | 状态(S=睡眠,R=运行,Z=僵尸,D=不可中断) |
| %CPU | CPU 使用率 |
| %MEM | 内存使用率 |
| TIME+ | 累计 CPU 时间 |
| COMMAND | 启动命令 |
2.5 htop 常用快捷键(补充)
| 快捷键 | 功能 |
|---|
F1 | 帮助 |
F2 | 设置(自定义显示列、配色等) |
F3 | 搜索进程 |
F4 | 过滤进程 |
F5 | 树状视图切换 |
F6 | 选择排序列 |
F9 | 发送信号(Kill) |
F10 | 退出 |
Space | 标记进程(可批量操作) |
u | 按用户筛选 |
H | 隐藏/显示用户线程 |
K | 隐藏/显示内核线程 |
t | 切换树状/列表视图 |
三、lsof —— 一切皆文件的侦探
lsof(List Open Files)基于 Linux "一切皆文件"的哲学,能列出所有被进程打开的文件,包括普通文件、目录、网络套接字、管道、设备等。它是排查端口占用、文件锁定、磁盘空间未释放等问题的利器。
3.1 基本语法
lsof [选项] [文件名]
3.2 核心参数
| 参数 | 作用 |
|---|
-i | 列出网络连接(可指定协议/端口/IP) |
-p <PID> | 查看指定进程打开的文件 |
-u <用户> | 查看指定用户打开的文件 |
-c <进程名> | 查看指定进程名打开的文件 |
+d <目录> | 列出目录下被打开的文件 |
+D <目录> | 递归列出目录下被打开的文件 |
-a | 多条件"与"连接 |
-d <FD> | 按文件描述符筛选 |
-g | 按 GID 筛选 |
-n | 不将 IP 转换为主机名(加快速度) |
3.3 输出字段解读
| 字段 | 含义 |
|---|
| COMMAND | 进程名称 |
| PID | 进程 ID |
| USER | 进程所有者 |
| FD | 文件描述符(见下表) |
| TYPE | 文件类型(见下表) |
| DEVICE | 磁盘设备 |
| SIZE/OFF | 文件大小/偏移量 |
| NODE | 索引节点 |
| NAME | 文件路径/名称 |
常见 FD 类型:
| FD | 含义 |
|---|
cwd | 当前工作目录 |
rtd | 根目录 |
txt | 程序代码(可执行文件或共享库) |
mem | 内存映射文件 |
0u | 标准输入 |
1u | 标准输出 |
2u | 标准错误 |
常见文件类型:
| TYPE | 含义 |
|---|
DIR | 目录 |
REG | 普通文件 |
CHR | 字符设备 |
BLK | 块设备 |
UNIX | UNIX 域套接字 |
FIFO | 管道 |
IPv4 / IPv6 | 网络套接字 |
3.4 高频实战命令
# 查看谁在使用某个文件lsof /var/log/syslog# 递归查看目录下被打开的文件lsof +D /var/log/# 查看某用户打开的所有文件lsof -u nginx# 查看某程序打开的文件lsof -c mysql# 同时查看多个程序lsof -c mysql -c apache# 排除某用户lsof -u ^root# 查看指定进程打开的文件lsof -p <pid># 列出所有网络连接lsof -i# 只看 TCP 连接lsof -i tcp# 只看 UDP 连接lsof -i udp# 查看谁在使用 3306 端口lsof -i :3306# 查看指定端口的 TCP 连接lsof -i tcp:80# 查看某用户的所有活跃网络端口lsof -a -u username -i# 查找已删除但空间未释放的文件(排查磁盘满问题)lsof | grep deleted
四、实战场景速查(补充)
场景 1:排查 CPU 飙高
# 1. 找到 CPU 占用最高的进程ps aux --sort=-%cpu | head -10# 2. 查看该进程的线程级 CPU 分布ps -p <pid> -Lo pid,lwp,pcpu,comm --sort=-pcpu | head -20# 3. 将线程 ID 转为十六进制,配合 jstack 定位 Java 热点代码printf "%x\n" <lwp>jstack <pid> | grep -A 20 <hex_lwp>
场景 2:排查内存泄漏
# 按内存排序,找到内存大户ps aux --sort=-rss | head -10# 持续监控某进程的内存变化watch -n 2 'ps -p <pid> -o pid,rss,vsz,comm'# 查看进程内存映射详情cat /proc/<pid>/smaps | head -50pmap -x <pid>
场景 3:排查磁盘空间被占满但 du 找不到大文件
# 已删除文件仍被进程持有,空间未释放lsof | grep deleted# 找到后可以 kill 对应进程或重启服务释放空间
场景 4:排查端口占用冲突
# 查看 8080 端口被谁占用lsof -i :8080# 或使用 ss 命令ss -tlnp | grep 8080
场景 5:排查僵尸进程
# 查找僵尸进程ps aux | awk '$8=="Z" {print}'# 找到僵尸进程的父进程ps -o ppid=-p <zombie_pid># 通知父进程回收(发送 SIGCHLD)kill -s SIGCHLD <ppid>
五、三大工具对比总结
| 维度 | ps | htop | lsof |
|---|
| 定位 | 进程快照 | 实时交互监控 | 文件/连接追踪 |
| 输出方式 | 静态文本 | 动态彩色界面 | 静态文本 |
| 适用场景 | 脚本自动化、精确筛选 | 人工实时观察 | 排查文件/端口/连接问题 |
| 学习成本 | 中 | 低 | 中 |
| 是否内置 | 是 | 需安装 | 多数发行版内置 |
六、延伸阅读(补充)
除了本文介绍的三大工具,以下命令也值得了解:
top —— 经典实时监控工具,htop 的前身
pidstat —— 按进程统计 CPU、内存、I/O(属于 sysstat 套件)
strace —— 跟踪进程的系统调用,排查异常行为
ss —— netstat 的现代替代,查看网络连接更快
nmon —— 综合性能监控工具,适合长时间数据采集
/proc 文件系统 —— 进程信息的终极来源,/proc/<pid>/ 下包含进程的所有细节
掌握 ps、htop、lsof 这三大工具,足以应对日常 90% 以上的进程监控和故障排查需求。建议收藏本文,在实际工作中反复实践,逐步形成自己的排查思路和命令组合。