Linux ps 命令详解:20 个实战案例与系统监控指南

深入解析 Linux ps 命令,涵盖从基础进程查看到高级格式化输出的 20 个实战案例。本文还探讨了进程状态码含义、容器环境下的 ps 表现以及如何高效识别僵尸进程,是系统管理员与开发者的必备手册。

阅读时长: 4 分钟
共 1702字
作者: eimoon.com

在 Linux 系统管理中,ps(Process Status)命令是观察系统运行状况的“第一现场”。它通过读取 /proc 文件系统中的实时数据,为我们提供当前进程的静态快照。

top 等交互式动态监控工具不同,ps 的优势在于其强大的格式化能力和脚本适配性。本文将通过 20 个实战案例,带你从基础用法进阶到高级运维技巧。

基础概念:列属性与进程状态

在深入案例之前,理解 ps 输出列的含义以及进程状态码至关重要。

常用列说明

列名 含义
PID 进程 ID(唯一标识)
PPID 父进程 ID
USER 运行该进程的用户
%CPU 进程占用的 CPU 百分比
%MEM 进程占用的物理内存百分比
RSS 常驻内存集(实际使用的物理内存,单位 KiB)
STAT 进程当前状态码
START 进程启动的时间
COMMAND 启动进程的完整命令

进程状态码(STAT)

当系统出现卡顿或异常时,STAT 列是诊断问题的核心:

  • R (Running):正在运行或在运行队列中等待。
  • S (Interruptible Sleep):可中断的睡眠状态,正在等待某个事件或信号。
  • D (Uninterruptible Sleep):不可中断的睡眠,通常是在进行 I/O 操作(如磁盘或 NFS 挂载异常时常现)。
  • Z (Zombie):僵尸进程。进程已结束,但父进程尚未回收其退出状态。
  • T (Stopped):已停止,通常是因为接收到了调试信号或作业控制信号。

BSD 风格与 POSIX 风格

Linux 版的 ps 兼容多种历史风格,这常让初学者感到困惑:

  • BSD 风格:参数前不带连字符(如 ps aux)。
  • POSIX / UNIX 风格:参数前带连字符(如 ps -ef)。

两者在功能上大体重合,但输出格式和默认列有所差异。建议在脚本中固定使用一种风格以保持兼容性。

20 个实战案例

1. 查看当前终端的进程

直接输入 ps,仅显示与当前 Shell 会话相关的进程。

ps

2. 列出所有进程 (-A 或 -e)

这是最常用的全局查看方式,显示系统上运行的所有进程。

ps -A
# 或者
ps -e

3. 查看特定终端关联的进程

ps -T

4. 排除会话领导者与终端进程

ps -a

5. 显示完整的进程信息 (BSD 风格)

ps -ax 会列出包括没有控制终端(TTY)在内的所有进程。

ps -ax

6. 用户导向的详细列表

显示 CPU、内存占用以及启动时间等更适合人类阅读的信息。

ps aux

7. 标准全格式列表 (POSIX 风格)

显示 UID, PPID, C (CPU 利用率) 等标准信息。ps -eF 则是更宽的变体。

ps -ef

8. 查看特定用户的进程

ps -u username
# 例如查看 root 用户的进程
ps -u root

9. 查看特定进程的线程

使用 -L 配合 PID 可以在诊断多线程应用(如 Java 或数据库)时查看具体线程分布。

ps -L 1234

10. 查看以特定身份(真实/有效用户)运行的进程

ps -U root -u root

11. 按组 ID (GID) 过滤进程

ps -fG group_name

12. 通过进程名查找 PID

-C 参数可以直接指定执行文件名。

ps -C bash

13. 显示特定 PID 的详细格式

ps -fp 1234

14. 以树状图显示进程关系

--forest 参数能清晰地展示父子进程的派生关系,非常适合排查孤儿进程。

ps -f --forest -C bash

15. 自定义输出列

在编写监控脚本时,通常只需要特定的几个字段:

ps -o pid,uname,comm -C bash

16. 查找特定进程的所有子进程

ps --ppid 1234

17. 综合查看特定进程的线程信息

ps -p 1234 -L

18. 格式化全局输出

ps -e -o pid,uname,pcpu,pmem,comm

19. 为输出列重命名

让输出报告更具可读性。

ps -e -o pid=PID,uname=USER,pcpu=CPU_USAGE,comm=COMMAND

20. 查看进程运行持续时间

etime 显示自进程启动以来经过的时间,对于发现长期滞留的僵死任务非常有用。

ps -e -o pid,comm,etime

进阶技巧与最佳实践

排序输出

虽然 ps 是静态的,但你可以通过 --sort 让其根据资源消耗排序。

# 按 CPU 使用率降序排列(前 15 个)
ps -eo pid,comm,%cpu,%mem --sort=-%cpu | head -n 15

# 按内存使用率降序排列
ps -eo pid,comm,%cpu,%mem --sort=-%mem | head -n 15

容器环境下的 ps

在 Docker 或 Kubernetes 容器中运行 ps 时,你会发现进程列表非常短。这是因为容器利用了 PID Namespace,容器内的初始进程(Entrypoint)PID 通常为 1。如果要在宿主机查看所有容器进程,需在宿主机执行 ps

捕获僵尸进程

僵尸进程(Zombie)虽然不占 CPU,但会占用 PID 槽位。以下命令可以快速定位系统中的僵尸进程:

ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/ { print }'

一旦发现僵尸进程,重点应检查其 PPID(父进程)。通常需要修复或重启父进程来完成收割。

脚本化建议

在脚本中判断服务是否运行,建议使用 pgrepps -C,而非 ps aux | grep name,因为后者往往会匹配到 grep 进程本身。

if ps -C nginx -o pid= | grep -q '[0-9]'; then
  echo "Nginx 正在运行"
fi

总结

ps 命令不仅是列出进程的工具,更是系统排障的基础。通过合理组合 -o 自定义列和 --sort 排序功能,你可以构建出精确的系统监控视图。当需要实时动态观察资源波动时,请配合 tophtop 使用;而当需要审计、快照或脚本化处理时,ps 则是无可替代的选择。

关于

关注我获取更多资讯

月球基地博客公众号二维码,扫码关注获取更多 AI 与编程资讯
📢 公众号
月球基地博客作者个人微信二维码,扫码交流 AI 与编程话题
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计