Linux ps 命令(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在 Linux 系统中,进程管理是开发者和运维人员的核心技能之一。而 ps(Process Status)命令作为进程监控的“瑞士军刀”,几乎可以完成所有进程信息的查询和分析。无论是排查程序崩溃、优化资源使用,还是理解系统负载,ps 都是不可或缺的工具。本文将从基础到进阶,结合实际案例,深入剖析 ps 命令的功能与用法,帮助读者掌握这一工具的精髓。


一、基础概念与核心语法

1.1 什么是进程?

在 Linux 系统中,进程是程序执行的实例。例如,当你运行 python3 app.py 时,系统会创建一个对应的进程来执行该脚本。进程具有状态(如运行、休眠)、资源占用(CPU、内存)以及关联的用户等属性。

ps 命令的核心作用就是 “照镜子”:它像一面镜子,能够实时映射系统中所有进程的当前状态。

1.2 ps 的基本语法

ps 的命令格式灵活多变,但最基础的用法如下:

ps [选项]  

常见选项与含义

选项描述
a显示所有终端的进程(包括非登录用户)
x包含未关联到终端的进程
u以用户友好的格式显示详细信息
f以“森林”格式显示进程的父子关系
aux经典组合选项(a + u + x),显示所有进程

示例:查看当前用户的所有进程

ps aux  

输出结果中,每一行代表一个进程,包含以下关键字段:

  • USER:进程所有者
  • PID:进程 ID(唯一标识)
  • %CPU%MEM:CPU 和内存占用率
  • COMMAND:启动进程的命令

二、进阶用法:过滤、排序与实时监控

2.1 过滤进程信息

在实际场景中,开发者可能需要针对特定条件筛选进程。例如,查找某个用户运行的所有 Python 进程:

示例:筛选用户 john 的 Python 进程

ps aux | grep "john" | grep "python"  

这里通过 grep 命令两次过滤:

  1. 第一次过滤用户 john
  2. 第二次过滤进程名包含 python

注意grep 自身也会出现在进程列表中,因此可能需要排除它:

ps aux | grep "[p]ython"  

通过在关键词前加 [p],可以避免 grep 自身被匹配到。

2.2 按资源占用排序

开发中常需定位“资源占用大户”。例如,按内存占用从高到低排序:

示例:按内存占用排序

ps aux --sort=-%mem  
  • --sort=-%mem 表示按内存占用降序排列(- 表示降序,默认升序)。

结合 head 取前 5 名

ps aux --sort=-%mem | head -n 6  

(前两行为标题和第一行数据,因此 head -n 6 实际显示前 5 个进程)


2.3 实时监控:pswatch 结合

ps 本身不支持实时刷新,但可以通过 watch 命令实现动态监控:

示例:每 2 秒刷新一次 CPU 占用率

watch -n 2 "ps aux --sort=-%cpu | head -n 10"  
  • -n 2:每 2 秒刷新一次
  • head -n 10:仅显示前 10 行

三、高级技巧:进程状态与终止操作

3.1 进程状态解析

进程的状态是系统健康的重要指标。psSTAT 列(在 ps -fps l 中可见)包含以下关键值:

  • R:正在运行或可运行(Ready)
  • S:休眠(Sleeping)
  • D:不可中断休眠(Disk Sleep,通常因 I/O 等待)
  • Z:僵尸进程(已结束但未被父进程回收)

示例:查看进程状态

ps -ef | grep "nginx"  

若某进程状态为 D,可能需排查磁盘或网络问题。

3.2 终止进程:kill 命令联动

通过 ps 定位目标进程后,可结合 kill 终止它:

示例:终止 PID 为 1234 的进程

kill 1234  

若进程未响应,可强制终止:

kill -9 1234  # 或 kill -SIGKILL 1234  

四、常见场景与最佳实践

4.1 场景 1:排查内存泄漏

当服务器内存不足时,可通过 ps 定位“内存吞噬者”:

ps aux --sort=-%mem | head -n 10  

结合 free -h 查看整体内存使用情况,判断是否需要优化代码或扩容。

4.2 场景 2:监控后台服务

开发中常需验证服务是否正常运行。例如,检查 Nginx 是否启动:

ps aux | grep "nginx" | grep -v "grep"  

若无输出,可能需要重新启动服务。

4.3 最佳实践

  • 避免频繁使用 ps aux:此命令会列出所有进程,可能影响系统性能,建议结合过滤条件。
  • 善用 man ps:查阅手册可了解更多选项,如 --ppid(按父进程 ID 过滤)。
  • 结合 tophtop:若需持续监控,可改用交互式工具 top,或安装 htop(更友好的界面)。

五、常见问题解答

5.1 为什么 ps 输出的 CPU 占用率总为 0?

若发现 %CPU 显示为 0,可能是因进程处于休眠状态或未被调度到 CPU。可通过 ps -p <PID> -o %cpu,cmd 精确查看单个进程的 CPU 使用率。

5.2 如何统计用户占用的总内存?

通过 awkps 的输出进行计算:

ps aux | awk '{sum += $6} END {print sum/1024 " MB"}'  

此命令计算所有进程的 RSS(常驻内存)总和,单位为 MB。


结论

ps 命令是 Linux 进程管理的基石工具,其灵活性和强大功能使其在开发、调试和运维中不可或缺。通过掌握基础选项、进阶过滤、实时监控以及与 kill 等命令的结合,开发者可以高效地诊断系统问题、优化资源分配,并提升系统稳定性。

对于初学者,建议从 ps aux 开始熟悉输出字段,逐步探索 --sort-o(自定义输出列)等高级功能。而对于中级开发者,可深入学习 ps 的组合用法,并结合 grepawk 等工具构建更复杂的分析流程。掌握 ps,即是掌握了 Linux 系统底层的“望远镜”与“手术刀”。

最新发布