做什么

打印当前所有进程的快照(一次性 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 nginxps aux | grep [n]ginx
  • VSZ 大不等于真占内存——看 RSS
  • macOS 的 ps 跟 Linux 略有差异