做什么
打印当前所有进程的快照(一次性 snapshot,不是实时——那是 top)。
两种风格
ps aux # BSD 风格(最常用)
ps -ef # System V 风格
ps -eLf # 含线程
两者输出列略不同,能力相当。记一个就行——多数人用 aux。
ps aux 输出列
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1234 0.1 0.5 1.2G 50M ? Ss 10:23 0:01 /usr/bin/nginx
| 列 | 含义 |
|---|---|
USER |
进程的所有者 |
PID |
进程号 |
%CPU |
CPU 占用百分比 |
%MEM |
物理内存占用百分比 |
VSZ |
虚拟内存大小 |
RSS |
物理内存占用(关心这个) |
TTY |
控制终端(? 表示无) |
STAT |
状态(R / S / D / Z / T) |
START |
启动时间 |
TIME |
累计 CPU 时间 |
COMMAND |
启动命令 |
STAT 字符
| 字 | 含义 |
|---|---|
R |
running / runnable |
S |
sleeping(可中断) |
D |
uninterruptible sleep(等磁盘 IO) |
Z |
zombie(已死但父进程没回收) |
T |
stopped |
< |
高优先级 |
N |
低优先级(nice) |
s |
session leader |
+ |
前台进程组 |
实战
ps aux | grep nginx # 找 nginx
ps aux --sort=-%cpu | head # CPU 最高
ps aux --sort=-%mem | head # 内存最高
ps -ef --forest # 树状(父子关系)
ps -u wadely # 某用户的进程
ps -p 1234,5678 # 看特定 PID
ps -C nginx # 按命令名
ps -eo pid,user,cmd,%cpu --sort=-%cpu | head # 自定义列
实战 2:找僵尸 / 占资源的
# 僵尸进程
ps aux | grep ' Z '
# 占内存最多
ps aux --sort=-rss | head
# 某用户的进程数
ps -u alice | wc -l
ps vs top
- ps = 一次快照
- top = 实时刷新
需要"现在"用 ps,需要"持续"用 top / htop。
坑
ps aux | grep nginx经常包含 grep 进程本身——用pgrep nginx或ps aux | grep [n]ginx- VSZ 大不等于真占内存——看 RSS
- macOS 的 ps 跟 Linux 略有差异