在 macOS 上按 BSD 语法抓取进程快照,查 PID、资源与父子关系。
macOS 的 ps 来自 BSD,不是 Linux 的 procps:没有 /proc,也不支持 GNU 的 --sort;-C 和 -L 虽然存在,但含义不同(-C 改变 CPU 百分比的计算方式,-L 列出可用的格式化关键字),照抄 Linux 用法会出错。常用组合是 aux(BSD 风格,含其他用户进程)和 -axo(自定义列),排序交给 sort,或直接用 -r(按 CPU)、-m(按内存)。按名字找进程用 pgrep,不要用 ps | grep。
边界:ps 是一次快照,CPU、内存都是采样或累计值,实时观察用 top。macOS 的状态码与 Linux 不同:U 表示不可中断等待(Linux 常写 D),I 表示空闲,僵尸仍是 Z。系统进程和 launchd 管理的守护进程,普通用户看到的字段可能不完整。
# 1. BSD 组合看全量进程;ww 防止长命令行被截断
% ps auxww | head -20
# 2. 按 CPU 排序取前 10;-A 选全部进程,-r 按当前 CPU 排序
% ps -A -r -o pid,ppid,%cpu,%mem,etime,comm | head -11
# 3. 查单个进程的父进程、状态和常驻内存
% ps -p "$(pgrep -x Finder)" -o pid,ppid,state,%cpu,rss,command
# 4. macOS 专有:查看某进程的线程(-M)
% ps -M "$(pgrep -x WindowServer)" | head -15
# 5. 精确匹配命令行,避免 grep 匹配自身
% ps -axo pid,stat,command | grep '[s]shd'
# 6. 找僵尸进程:STAT 以 Z 开头
% ps -axo pid,ppid,stat,command | awk '$3 ~ /^Z/'
ps aux | grep name 会匹配 grep 自身,长命令行还可能被截断;用 pgrep -fl name 或 [n]ame 技巧。验证:对比 pgrep -fl name 的结果。ps 没有 --sort,照抄 Linux 命令会报 illegal option;用 -A -r、-A -m,或把 -o 输出交给 sort -k。%cpu 在 macOS 上是加权采样值,不是 Linux 的“生命周期平均”;和 top 对不上是正常的,实时占用看 top -o cpu。U 是不可中断等待(常见于磁盘、网络文件系统),不是 D;kill -9 也要等内核返回。Z 是僵尸,杀不掉,只能等父进程回收。ps -p PID 找不到进程时返回非 0,set -e 脚本会中断;先用 kill -0 PID 或显式处理退出码。验证:ps -p 999999 >/dev/null; echo $?。comm 是内核里的短进程名,可能被截断;完整路径和参数要用 command/args 列。top — 实时刷新 CPU、内存和线程。kill、killall — 按 PID 或进程名发信号。launchctl — 查看 launchd 管理的进程和退出码。ps — 对照 procps 版的选项差异。合上页面,先回答,再展开对照。
ps 为什么不能照抄 Linux 的 ps --sort=-%cpu?替代写法是什么?STAT 里的 U 和 Z 分别表示什么?哪个能靠 kill -9 清掉?kill -0 比解析 ps 输出更稳?ps,不支持 --sort;可用 ps -A -r 按 CPU、ps -A -m 按内存,或把 -o 输出交给 sort -k。U 是不可中断等待(等 I/O),Z 是已退出待回收的僵尸;两者都不能靠 kill -9 解决,僵尸只能由父进程回收。kill -0 只做存在性和权限检查、不发送信号,退出码直接可用;ps 的输出格式和列宽会随版本、终端变化,不适合解析。
小程序版
微信扫码,随时查命令