ps -o 是什么
ps 默认输出列固定,还会按终端宽度截断 CMD 列,排查时常看不全。ps -o 让你自定义显示的列:配合 -e 看全局、-p 看指定进程、-L 看线程、--sort 排序,是获取「谁起的、跑了多久、什么状态、吃了多少资源」最省字数的方式。ps 读的是 /proc 的瞬时快照,不做持续采样,需要看趋势时要换 top、pidstat 或 sar。
基本信息
| 适用平台 | Linux(procps-ng);BSD 与 UNIX 两种选项风格见下方提示 |
|---|---|
| 命令语法 | ps -eo 列1,列2,... [--sort=列] |
| 常用列 | pid ppid stat etime etimes lstart cmd %cpu %mem nlwp rss vsz wchan user |
| 取指定进程 | ps -p PID -o pid,ppid,stat,etime,lstart,cmd |
| 线程视图 | ps -L -o pid,tid,psr,pcpu,comm -p PID |
| 权限说明 | 普通用户可看自己的进程;看全部进程的完整命令行与 wchan 通常需要 root |
典型使用场景
- 确认上线时间:lstart 给出精确启动时刻,与 etime 互相印证,判断滚动更新是否真的生效
- 线程排查:nlwp 看线程总数,再用 -L 逐线程定位哪个 tid 占 CPU
- 僵尸进程定位:stat 含 Z 的进程,顺着 ppid 找不负责任的父进程
- 孤儿进程:ppid 为 1 说明原父进程已退出、进程被 init 或 systemd 收养
- 脚本取数:只输出需要的列,避免解析带空格的对齐文本
常用示例
常用示例
ps -eo pid,ppid,stat,etime,cmd --sort=-etime | head # 运行时间最长的进程
ps -eo pid,lstart,cmd | grep -i java # 查看精确启动时间
ps -eo pid,nlwp,cmd --sort=-nlwp | head # 线程数排行
ps -p 1234 -o pid,ppid,stat,etime,lstart,cmd # 单进程完整详情
ps -eo stat | sort | uniq -c | sort -rn | head # 进程状态分布
ps -eo pid,user,pcpu,pmem,rss,cmd --sort=-rss | head # 按常驻内存排行常用输出列读法
| 列 | 含义 | 正常与异常 |
|---|---|---|
| pid / ppid | 进程号与父进程号 | ppid 为 1 多为被 systemd 收养的守护进程 |
| stat | 进程状态与附加标志 | Z 僵尸、D 不可中断都需要单独处理 |
| etime / etimes | 已运行时长:格式化文本 / 纯秒数 | 要参与数值比较就用 etimes |
| lstart | 进程启动的绝对时刻 | 与重启记录、发布时间对照可验证更新是否生效 |
| %cpu / %mem | 从进程启动至今的平均占用 | 不是瞬时值,短命的高 CPU 进程会被明显稀释 |
| nlwp | 线程数量 | Java 类进程几十到几百正常,持续增长提示线程泄漏 |
| wchan | 进程正在等待的内核函数 | D 状态配合 dmesg 判断是否卡在磁盘 IO |
stat 首位含义:R 运行、S 可中断睡眠、D 不可中断(多在等 IO)、Z 僵尸、T 停止、I 空闲内核线程;后缀要留意:s 表示会话首进程、l 表示多线程、+ 表示前台进程组。
ps 的两种选项风格不能混用:BSD 风格(ps aux、ps axjf)与 UNIX 风格(ps -ef、ps -eo)混写会直接报错或静默忽略某个选项。脚本里统一用 -eo 这种 UNIX 风格,跨发行版更稳。另外 --sort 与 -o 的可选列都是 procps 的扩展,BusyBox 等精简实现上并不完整,脚本需要自己接管道 sort 兜底。