任务管理器
Task Manager 插件把你 Mac 上正在运行的进程变成一个你可以浏览的文件夹。它在驱动器栏中显示为一个 TaskManager 驱动器;打开它,每个进程都是一行,你可以对其排序、像文件一样查看,或结束它 —— 使用你已经用于文件的相同按键。由于它是插件,你可以从 配置 ▸ 插件… 中将其停用或移除。
打开它¶
- 在驱动器栏中单击 📊 TaskManager 条目(它就在你的启动驱动器之后)。
- 面板会填满,每个正在运行的进程占一行。每行的名称是进程名后跟其 PID,例如
Finder (462)。 - 你在其中时 TaskManager 按钮保持选中,标签页也以该驱动器命名。切换到另一个标签页再切回来——或者退出并重新打开 App——标签页都会回到进程列表。要离开它,向上一级或在驱动器栏中点按另一个宗卷。
(图:以文件列表形式显示的正在运行的进程,你可以对其排序和操作。)
每列的含义¶
除了日期(启动时间)列,Task Manager 还添加了进程列。进程行的大小显示为 DIR,因为进程是可以打开的文件夹(见下文)——内存有自己的列:
| 列 | 含义 |
|---|---|
| PID | 进程 id |
| CPU % | 近期处理器使用率(需要第二次刷新后才会出现) |
| Memory | 内存占用(footprint)——该进程需要负责的部分(活动监视器显示的数字) |
| Resident | 常驻大小,含共享页;对每个进程都会填写 |
| Threads | 线程数 |
| State | R 运行 · S 睡眠 · T 已停止 · Z 僵尸 · I 空闲,外加 ps 附加的后缀(s = 会话首进程,+ = 前台,N = 低优先级) |
| User | 所有者 |
| PPID | 父进程 id |
| Read | 自进程启动以来从磁盘读取的字节数 |
| Written | 自进程启动以来写入磁盘的字节数 |
| Wakeups | 自进程启动以来的中断唤醒次数 |
| Signed | 谁签署了该程序:Apple、拥有 Developer ID 的团队、临时签名或未签名 |
| Command | 完整命令行 |
像在普通文件夹中一样,可以按任意列排序(例如 CPU % 或 大小/内存)。
查看或结束进程¶
- 查看(F3) 会显示一份 Process Information 报告:名称、PID、父进程、用户、状态、线程、内存、CPU、启动时间、可执行文件路径以及完整命令行。
- 删除(F8) 会结束进程。第一次删除会发送一个温和的 退出(SIGTERM);对仍在运行的进程再次删除会升级为 强制退出(SIGKILL)。插件绝不会针对 PID 1。
查找正在使用某个文件的进程¶
右键点按任意行并选择 按文件查找进程…,然后输入文件路径。当前打开该文件的每个进程都会高亮显示,光标会跳到第一个能够修改它的进程:
- 蓝色 — 进程只读取该文件。
- 橙色 — 进程只写入该文件。
- 紫色 — 进程两者都做。
路径会从另一个面板的光标位置预先填入,因此你可以在那边指向一个文件,无需输入即可提问。同一菜单中的 按端口查找进程… 回答的是姊妹问题:哪个进程正在 TCP/UDP 端口上监听。选择 清除文件高亮 可移除这些颜色;离开进程列表同样会移除它们。
打开进程即可看到它的文件¶
在进程上按回车键——或双击它——面板就会列出该进程当前打开的文件,作为带有真实大小和日期的普通文件行。在那里:
- 查看 (F3) 打开文件本身。
- 转到文件 在另一个面板中显示它,你可以在那里处理它。
- 在访达中显示 把它交给访达。
只有打开的文件才算:进程仅映射到内存中的库,以及它的工作目录,都不是打开的文件。其他用户的进程会显示为空文件夹。
说明¶
- 基本信息(PID、父进程、用户、状态、签名)对每个进程都可读。内存占用、线程、磁盘 I/O 和打开文件列表可读的是你自己的进程,在一台普通的 Mac 上这已是列表的大部分。对于其他用户的进程,CPU 和 Resident 改为从
ps填充——那是整个生命周期的平均值,而不是其他行所带的两次采样之差——线程和内存占用则保持为空。 - CPU % 是两次采样之间的变化量,因此在面板第二次刷新之前它是空白的(面板大约每两秒刷新一次)。
- 除结束进程外,该列表是只读的 —— 你无法将文件复制到其中。
- 高亮颜色随你的配色主题变化:Norton 调色板改用绿色、红色和洋红色。
- 只能找到你的账户有权查看的句柄,实际上就是你自己的进程。进程仅映射到内存中的库,或其工作目录,都不是打开的句柄,因此不会报告。
- Signed 列会在最初几秒内逐渐填满:读取一个签名约需一毫秒,而不同的程序有数百个,因此每次刷新读取几个并记住结果。空白单元格表示“尚未读取”,而不是“未签名”。
- Signed 说明谁签署了程序,而不是它是否已公证:检查公证需要对整个程序做哈希,每个都要花上几秒。
- 这里的快速筛选(Ctrl+S)也会匹配列而不仅仅是名称,并且每一项都可以指明它作用的列:
user:root state:R就是在问 root 现在正在运行什么。各项以空格分隔并且必须全部匹配;没有指明列的文字仍然是一个整体的子串,包括其中的空格。