ps 是什么
ps 读取 /proc 里的进程信息,输出一张当前时刻的进程快照。它有两套参数风格:BSD 风格的 ps aux 与 UNIX 风格的 ps -ef,两套的选项含义不同,混着写虽然多数实现容错,但更容易看错列。默认情况下 ps 只列出当前终端会话里的进程,要看全部进程必须显式加 a 或 e。要观察动态变化用 top 或 htop,ps 的价值在于精确筛选自定义列、便于写进脚本。
基本信息
| 适用平台 | Linux 全发行版与 macOS(procps-ng / BSD ps);BSD 版支持的选项更少,脚本按 POSIX 兼容子集写更稳 |
|---|---|
| 命令语法 | ps [选项];BSD 风格 ps aux,UNIX 风格 ps -ef |
| 常用选项 | -e 全部进程、-f 完整格式、-u 指定用户、-p 指定 PID、-C 按命令名筛选、-o 自定义输出列、--sort 指定排序、-ww 不截断宽度、--forest 显示进程树、-L 显示线程 |
| 权限说明 | 普通用户能看到进程列表,但其他用户的完整命令行与部分字段需要 root;挂载 /proc 时启用 hidepid 会限制可见范围 |
| 数据来源 | 直接读取 /proc/[pid]/ 下的文件,因此反映的是读取瞬间的状态 |
典型使用场景
- 确认进程是否存在:按命令名或用户筛选,判断服务是否真的在跑
- 资源排行:按 CPU 或内存排序找出占用最高的进程
- 查看父子关系:--forest 看进程树,定位是谁拉起了异常子进程
- 精确取字段:用 -o 指定列后交给 awk 处理,脚本里比解析整行可靠
- 检查进程状态:STAT 列区分运行、睡眠、僵尸与停止,僵尸进程处理方式不同
- 查看线程:-L 把线程按行展开,排查线程数异常增长
常用示例
常用示例
ps aux | head
ps aux --sort=-%cpu | head -15 # CPU 排行
ps aux --sort=-%mem | head -15 # 内存排行
ps -ef | grep -v grep | grep nginx
ps -eo pid,ppid,user,stat,pcpu,pmem,rss,etime,cmd --sort=-rss | head
ps -C nginx -o pid,etime,rss,cmd # 按命令名筛选
ps -ef --forest | head -40 # 进程树
ps -L -p 1234 -o pid,tid,stat,pcpu,cmd | head # 线程视图
ps -eo stat,pid,cmd | awk '$1 ~ /^Z/' # 找出僵尸进程常用列读法
| 列 | 含义 | 注意 |
|---|---|---|
| PID / PPID | 进程号与父进程号 | 追来源看 PPID,配合 --forest 更直观 |
| STAT | 状态位:R 运行、S 可中断睡眠、D 不可中断睡眠、Z 僵尸、T 停止、l 多线程、s 会话首进程 | 大量 D 说明卡在 IO,Z 需要处理父进程 |
| %CPU / %MEM | 占用的 CPU 与物理内存百分比 | %CPU 是进程生命周期内的平均值,不是瞬时值 |
| RSS / VSZ | 常驻物理内存 / 虚拟内存大小 | 判断真实内存占用看 RSS,VSZ 包含未真正使用的映射 |
| TIME | 累计占用的 CPU 时间 | 与 START/ELAPSED 配合判断是否长期吃 CPU |
| CMD | 启动命令,加 -f 时含参数 | 列宽不足会被截断,加 -ww 或自定义列 |
ps 显示的是快照,抓不到已经退出或一闪而过的进程;排查短命进程要用 execsnoop 之类的工具,或在批处理里高频采样。要看实时变化用 top,要看历史趋势用监控系统。
僵尸进程(STAT 为 Z)已经结束但父进程没有回收它的退出状态,kill 对它无效,处理方向是让父进程正常回收或重启父进程。大量僵尸通常是父进程逻辑缺陷的信号,而不是僵尸本身的问题。
容器内 ps 看到的是当前 PID 命名空间里的进程,通常只有一两个;看不到宿主机进程属于正常现象,需要查看宿主请到宿主或使用具有 host 共享命名空间的工具。
追查「谁拉起了这个可疑进程」时,用 ps -eo pid,ppid,user,cmd --forest 顺着进程树往下看,比在 ps aux 的长列表里逐行找直观得多。反过来,想知道某个监听端口属于哪个进程,用 ss -lntp 比 ps 更直接。