Mac进程检查器,就内置在你的活动监视工具里。
点按任意进程,它的面板就会显示:它所属的App、代码签名和团队ID、它的授权、父进程和Launch Agent、完整的命令行,以及它自启动以来用掉的CPU时间、内存、打开的文件和监听端口。App还会加上版本、软件包ID和Info.plist。可以存储为CSV,或在“终端”中用vitals process获取同样的内容。
- 版本
- 156.0.8078.74
- 软件包ID
- com.google.Chrome
- 架构
- 通用 · x86_64 · arm64
- 签名
- Google LLC · 团队ID EQHXZ8M8AV
- 保护
- 强化运行时未沙盒化
- 用户
- me
- 已运行
- 6h 14m
- 位置
- /Applications/Google Chrome.app
- 版本
- 2.15
- 软件包ID
- com.apple.Terminal
- 架构
- Apple 芯片 · arm64e
- 签名
- Apple
- 保护
- 无强化运行时未沙盒化
- 用户
- me
- 已运行
- 2d 6h
- 位置
- /System/Applications/Utilities/Terminal.app
- 版本
- 4.88.1
- 软件包ID
- com.docker.docker
- 架构
- Apple 芯片 · arm64
- 签名
- Docker Inc · 团队ID 9BNSXJN65R
- 保护
- 强化运行时未沙盒化
- 用户
- me
- 已运行
- 3d 1h
- 位置
- /Applications/Docker.app
- 进程ID
- 48190
- 父进程
- launchd (1)
- 已运行
- 6h 14m
- 软件包ID
- com.google.Chrome
- 版本
- 156.0.8078.74
- 架构
- 通用 · x86_64 · arm64
- 签名
- Google LLC · 团队ID EQHXZ8M8AV
- 强化运行时
- 是
- 沙盒
- 否
- 授权
- 1
- CPU时间
- 42m 10s 用户 32m 54s · 78%系统 9m 16s · 22%
- 内存
- 412 MB · 峰值 672 MB 的 61%
- 线程
- 64
- 打开的文件
- 318
- 进程ID
- 48211
- 父进程
- Google Chrome (48190)
- 启动者
- Google Chrome (48190)
- 已运行
- 6h 12m
- 版本
- 156.0.8078.74
- 架构
- 通用 · x86_64 · arm64
- 参数
- --type=renderer --lang=en-US --num-raster-threads=4 --enable-zero-copy
- 签名
- Google LLC · 团队ID EQHXZ8M8AV
- 强化运行时
- 是
- 沙盒
- 否
- 授权
- 1
- CPU时间
- 12m 40s 用户 10m 23s · 82%系统 2m 17s · 18%
- 内存
- 1.92 GB · 峰值 2.18 GB 的 88%
- 线程
- 23
- 打开的文件
- 96
- 进程ID
- 48193
- 父进程
- Google Chrome (48190)
- 启动者
- Google Chrome (48190)
- 已运行
- 6h 14m
- 版本
- 156.0.8078.74
- 架构
- 通用 · x86_64 · arm64
- 参数
- --type=gpu-process --lang=en-US --gpu-preferences=UAAAAAAAAADgAAAEAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAA
- 签名
- Google LLC · 团队ID EQHXZ8M8AV
- 强化运行时
- 是
- 沙盒
- 否
- 授权
- 1
- CPU时间
- 18m 2s 用户 12m 37s · 70%系统 5m 25s · 30%
- GPU
- 3%
- 内存
- 842 MB · 峰值 904 MB 的 93%
- 线程
- 31
- 打开的文件
- 142
- 进程ID
- 48377
- 父进程
- Google Chrome (48190)
- 启动者
- Google Chrome (48190)
- 已运行
- 3h 40m
- 版本
- 156.0.8078.74
- 架构
- 通用 · x86_64 · arm64
- 参数
- --type=renderer --lang=en-US --num-raster-threads=4 --enable-zero-copy
- 签名
- Google LLC · 团队ID EQHXZ8M8AV
- 强化运行时
- 是
- 沙盒
- 否
- 授权
- 1
- CPU时间
- 4m 51s 用户 4m 2s · 83%系统 49s · 17%
- 内存
- 1.31 GB · 峰值 1.36 GB 的 96%
- 线程
- 21
- 打开的文件
- 88
- 进程ID
- 581
- 父进程
- launchd (1)
- 已运行
- 2d 6h
- 软件包ID
- com.apple.Terminal
- 版本
- 2.15
- 架构
- Apple 芯片 · arm64e
- 签名
- Apple
- 强化运行时
- 否
- 沙盒
- 否
- 授权
- 6
- CPU时间
- 3m 12s 用户 2m 2s · 64%系统 1m 10s · 36%
- 内存
- 148 MB · 峰值 208 MB 的 71%
- 线程
- 12
- 打开的文件
- 58
- 进程ID
- 60120
- 父进程
- login (60118)
- 启动者
- 终端 (581)
- 已运行
- 2d 5h
- 架构
- Apple 芯片 · arm64e
- 参数
- -zsh
- 签名
- Apple
- 强化运行时
- 否
- 沙盒
- 否
- CPU时间
- 1.2s 用户 0.7s · 58%系统 0.5s · 42%
- 内存
- 12 MB · 峰值 20 MB 的 60%
- 线程
- 1
- 打开的文件
- 8
- 进程ID
- 60412
- 父进程
- zsh (60120)
- 启动者
- 终端 (581)
- 已运行
- 2d 4h
- 架构
- Apple 芯片 · arm64
- 参数
- node_modules/.bin/next dev --port 3000
- 签名
- Node.js Foundation · 团队ID HX7739G8FX
- 强化运行时
- 是
- 沙盒
- 否
- CPU时间
- 1h 52m 用户 1h 42m · 91%系统 10m 5s · 9%
- 内存
- 486 MB · 峰值 797 MB 的 61%
- 线程
- 19
- 打开的文件
- 203
- 监听端口
- 3000
- 进程ID
- 60533
- 父进程
- zsh (60120)
- 启动者
- 终端 (581)
- 已运行
- 14s
- 架构
- Apple 芯片 · arm64
- 参数
- node_modules/.bin/vitest run --coverage
- 签名
- Node.js Foundation · 团队ID HX7739G8FX
- 强化运行时
- 是
- 沙盒
- 否
- CPU时间
- 9.1s 用户 8.0s · 88%系统 1.1s · 12%
- 内存
- 391 MB · 峰值 391 MB 的 100%
- 线程
- 27
- 打开的文件
- 412
- 进程ID
- 20288
- 父进程
- launchd (1)
- 已运行
- 3d 1h
- 软件包ID
- com.docker.docker
- 版本
- 4.88.1
- 架构
- Apple 芯片 · arm64
- 签名
- Docker Inc · 团队ID 9BNSXJN65R
- 强化运行时
- 是
- 沙盒
- 否
- 授权
- 7
- CPU时间
- 6m 4s 用户 4m 31s · 74%系统 1m 33s · 26%
- 内存
- 112 MB · 峰值 233 MB 的 48%
- 线程
- 22
- 打开的文件
- 74
- 进程ID
- 20311
- 父进程
- Docker (20288)
- 启动者
- Docker (20288)
- 已运行
- 3d 1h
- 版本
- 4.88.1
- 架构
- Apple 芯片 · arm64
- 参数
- -watchdog -max-restarts 5
- 签名
- Docker Inc · 团队ID 9BNSXJN65R
- 强化运行时
- 是
- 沙盒
- 否
- 授权
- 7
- CPU时间
- 3h 8m 用户 2h 0m · 64%系统 1h 8m · 36%
- 内存
- 1.57 GB · 峰值 2.04 GB 的 77%
- 线程
- 48
- 打开的文件
- 241
- 进程ID
- 20340
- 父进程
- com.docker.backend (20311)
- 启动者
- Docker (20288)
- 已运行
- 12s
- 版本
- 4.88.1
- 架构
- Apple 芯片 · arm64
- 签名
- Docker Inc · 团队ID 9BNSXJN65R
- 强化运行时
- 是
- 沙盒
- 否
- 授权
- 1
- CPU时间
- 2.0s 用户 1.6s · 80%系统 0.4s · 20%
- 内存
- 64 MB · 峰值 64 MB 的 100%
- 线程
- 9
- 打开的文件
- 31
- 进程ID
- 20318
- 父进程
- com.docker.backend (20311)
- 启动者
- Docker (20288)
- 已运行
- 3d 1h
- 版本
- 4.88.1
- 架构
- Apple 芯片 · arm64
- 签名
- Docker Inc · 团队ID 9BNSXJN65R
- 强化运行时
- 是
- 沙盒
- 否
- 授权
- 3
- CPU时间
- 1h 4m 用户 31m 12s · 49%系统 32m 48s · 51%
- 内存
- 38 MB · 峰值 52 MB 的 73%
- 线程
- 14
- 打开的文件
- 46
这些数字是模拟的:网页读取不了你的Mac,也不应该读取。
进程背后的App、它的代码签名和授权。
面板先显示进程所属的App和它是哪种进程:浏览器标签页、扩展程序、GPU进程、开发服务器。然后是它的代码签名,包括开发者名称和团队ID、它是否使用强化运行时和沙盒、它拥有的每项授权,以及它是为Apple 芯片、Intel还是两者构建的、是否正通过Rosetta运行。
- 它所属的App,以及它是标签页、扩展程序还是帮助程序
- 代码签名,带团队ID;Apple自己的显示Apple
- 强化运行时、沙盒,以及每一项授权
- 为Apple 芯片、Intel或两者构建,以及是否由Rosetta运行
父进程、Launch Agent和完整的命令行。
每个进程都有父进程,Vitals会指出它,以及启动它的App;对于后台进程,还会指出在登录时通过launchd启动它的Launch Agent或Launch Daemon。完整的命令行能让一个光秃秃的node或python现出原形:原来是你熟悉的某个项目的开发服务器。下方是它启动的子进程,点一下就能看到。
- 父进程和启动它的App,各是一个链接
- 在登录时启动它的Launch Agent或Launch Daemon
- 完整的命令行,以及打开后可见的环境
- 子进程,各有自己的数据
自启动以来的CPU时间、内存峰值、打开的文件和监听端口。
百分比说的是这一秒。面板涵盖进程的整个生命周期:自启动以来的CPU时间,分为它自己的工作和内核替它做的工作;当前内存与它曾占用的最高值之比;线程、打开的文件、页面输入、读取和写入的字节、它正在监听的端口,面板打开时还有CPU和内存的实时图表。
- CPU时间,分为用户和系统
- 当前内存,占历史峰值的比例
- 线程、打开的文件、页面输入、磁盘读取和写入
- 监听端口,以及面板打开期间的实时图表
App的版本、软件包ID和Info.plist,以及它下面的每个进程。
打开一个App,它的“详细信息”卡片会给出版本、软件包ID、位置、代码签名和由什么启动,点一下就能看到完整的Info.plist。它的进程列在下方,每个点一下就能看到详细信息。刚启动的进程带有“新”标记,最近十分钟内结束的进程仍留在列表中,所以一次崩溃或来了又走的帮助程序不会丢失。
- 版本、软件包ID和完整的Info.plist
- 每个进程,刚启动的带有“新”标记
- “最近结束”:最近十分钟内关闭了什么
- 选择表格的列,并用
/a regex/过滤
把进程导出为CSV,或在“终端”中运行vitals process。
每个面板都有导出菜单:“拷贝为文本”用于消息或错误报告,“存储为CSV”用于电子表格,都包含Info.plist和授权。在“终端”中,vitals process按名称或PID返回任何进程的同样内容,AI助手则通过MCP的process_details工具获取。
- 拷贝为文本,或存储为CSV
vitals process node,或按PID,加--json供脚本使用--env加上环境,--plist加上Info.plist- 通过MCP给Claude、Codex和Cursor的
process_details工具
进程检查器:之前与之后
活动监视器的“检查”窗口给出进程的父进程、用户、CPU时间、内存、打开的文件和端口,以及取样。它不会说谁签名、一个光秃秃的node属于哪个App、登录时由什么启动,或完整的命令行是什么。要查这些,你得打开“终端”:codesign查签名,ps查参数,launchctl查由什么启动,lsof查端口,plutil查Info.plist。
问题通常比这简单。这是什么?一个叫Helper的进程,一个没人记得启动过的python,一个名字像com.apple.something、用掉半个核心的东西。它是我安装的App的一部分吗,是Apple的吗,它应该在运行吗?
Vitals在一个面板里回答:进程所属的App和它是哪种进程,它的代码签名和授权,它的父进程和命令行,它启动的进程,以及它自启动以来用掉的CPU时间、内存、文件和端口,版本、Info.plist和授权折叠在下方。同样的答案也以CSV、“终端”中的vitals process,以及AI助手的工具形式提供。
在Vitals中的位置
标签页、菜单栏项和设置,按你会用到的顺序排列。
- 01
点按任意进程打开它的面板
在任意标签页中,点按一个App,再点按它的一个进程,或在App的面板中悬停在某个进程上并点按ⓘ。面板就会打开到它。⌘F按名称查找进程,
/a pattern/用正则表达式搜索。 - 02
逐个部分阅读面板
“身份”,然后是“App”或“可执行文件”、“安全性”、“资源使用情况”、“磁盘”、“网络”和“子进程”。Info.plist、“授权”和“环境”折叠起来,直到你打开它们。父进程、启动者和每个子进程都是链接:点一下就跳转过去。
- 03
选择进程表格的列
工具栏中的“列”按钮添加或移除标签页的列:PID、用户、路径、版本、启动时间、闲置唤醒和各项读数。每个标签页保留自己的选择。
- 04
拷贝、存储为CSV,或在“终端”中查询
面板标题中的共享按钮提供“拷贝为文本”和“存储为CSV”。在“终端”中,
vitals process <name>或vitals process <pid>,加--json、--env或--plist。通过MCP,则是process_details工具。
codesignvitals process --json背后的术语
这些数字是什么意思,摘自活动监视器术语表。
- PID
PID即进程ID,是macOS分配给每个正在运行的进程、用来识别它的数字。
- launchd
launchd是macOS开机时启动的第一个进程,进程ID为1。
- 帮助程序
帮助程序是App为完成部分工作而启动的独立进程,例如渲染网页、运行扩展或处理图形。
- 线程
线程是进程内部一条独立的执行路径,一个进程可以在不同的CPU内核上同时运行多个线程。
- 监听端口
监听端口是某个进程在等待传入连接的网络端口,比如在端口3000上运行的Web服务器。
- WindowServer
WindowServer是macOS的系统进程,负责管理窗口,把各个App绘制的内容合成为显示器上的最终画面,并把点按、按键等输入事件传给对应的App。
- 取样进程
“取样进程”是活动监视器中的一个工具,会在几秒钟内记录所选进程在做什么,并生成一份文本报告,说明它的线程把时间花在了哪里。
- 强制退出
“强制退出”会立即结束一个App或进程,不给它保存或清理的机会。
问题
购买前,大家关于进程检查器最常问的问题。
如何打开进程检查器?
在任意列表中点按一个进程,它的面板就会打开。在App的面板中,每个进程是一行:点按它,或点按悬停时出现在它旁边的ⓘ。按⌘F按名称查找进程,输入/a pattern/可用正则表达式搜索。
进程的代码签名能告诉我什么?
谁构建了这段代码。带团队ID的名称是Apple已识别的开发者,例如Google LLC或Docker Inc。Apple自己的进程显示Apple。“已签名,无证书”是在Mac上构建、没有具体签名者的工具,这对Homebrew和你自己编译的东西来说很正常。“未签名”表示完全没有签名。下方是:它是否使用强化运行时、是否在沙盒中运行,以及它被授予的每一项授权。
Vitals能告诉我某个进程是否安全,或者是不是恶意软件吗?
它给你判断所需的事实:代码签名、父进程、它在哪里,以及它在做什么。有团队ID的知名开发者、沙盒,以及你认识的父进程,就是你希望看到的。没有签名、路径在隐藏文件夹里、还有一个你从未安装过的Launch Agent,就值得仔细看看。Vitals不扫描恶意软件;它告诉你那里有什么。
什么是CPU时间,为什么分为用户和系统?
CPU时间是进程自启动以来让一个核心保持忙碌的时长,累计计算:一个进程以单核50%运行两小时,就用了一小时。用户时间是进程自己的工作;系统时间是内核替它做的工作,比如读取文件或访问网络。一个做得不多却系统时间占比很高的进程,通常说明它在忙着向macOS要东西。
为什么有些进程显示的详细信息比其他进程少?
macOS只向进程所属的用户显示它的命令行、环境和累计总量。属于macOS或其他账户的进程会把这些留给自己;它的身份、签名和数据仍会显示,数据通过Vitals的可选帮助程序获取。在“设置”→“通用”中打开“完整系统指标”即可获取。
它会显示WindowServer和kernel_task这样的macOS进程吗?
会。它们的App是macOS,签名是Apple的,父进程是launchd。打开帮助程序后,它们的CPU和内存也会显示,面板的图表在打开期间持续运行。
我能看到进程的环境变量吗?
能,在面板末尾的“环境”部分,折叠起来直到你打开它,也能在“终端”中用vitals process --env查看。它们绝不会传给AI助手,因为环境里常常有密钥。
进程结束后,Vitals会保留它多久?
十分钟,在App的面板中,带有它的名称、启动和结束时间,以及它占用的内存。所以崩溃的帮助程序,或你不在时完成的构建,仍然能看到。
我能在“终端”中或从AI助手获取进程的详细信息吗?
有。vitals process node或vitals process 60412给出同样的详细信息,以文本显示,或加--json供脚本使用;--env加上环境,--plist加上App的Info.plist。Claude、Codex或Cursor这样的助手通过Vitals MCP服务器的process_details工具获取,需要时也包括Info.plist。
它能对进程取样或生成Spindump吗?
不能。那是活动监视器的功能,Vitals不照搬。Vitals回答的是进程是什么,附上它的代码签名、父进程和资源用量;要看挂起App的堆栈跟踪,打开活动监视器并按“取样”。
继续阅读
用到它的指南,以及Vitals与大家为此购买的App相比如何。