在 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(父进程)。通常需要修复或重启父进程来完成收割。
脚本化建议
在脚本中判断服务是否运行,建议使用 pgrep 或 ps -C,而非 ps aux | grep name,因为后者往往会匹配到 grep 进程本身。
if ps -C nginx -o pid= | grep -q '[0-9]'; then
echo "Nginx 正在运行"
fi
总结
ps 命令不仅是列出进程的工具,更是系统排障的基础。通过合理组合 -o 自定义列和 --sort 排序功能,你可以构建出精确的系统监控视图。当需要实时动态观察资源波动时,请配合 top 或 htop 使用;而当需要审计、快照或脚本化处理时,ps 则是无可替代的选择。
关于
关注我获取更多资讯