PID
又称:进程ID
简要回答
PID即进程ID,是macOS分配给每个正在运行的进程、用来识别它的数字。正在运行的进程不会共用同一个PID,但一个进程结束后,它的号码可能会被重复使用。
活动监视器用单独的一列显示PID。kill、sample和lsof等“终端”命令靠PID来确定你指的是哪个进程,因为多个进程可能同名。
在macOS上,PID 0是kernel_task,PID 1是launchd,也就是启动系统其余部分的第一个进程。你打开的App会得到更大的号码,而且每次启动都会得到新的PID。
本页内容
如何查找App的PID
在活动监视器的列表中找到该App,查看“PID”列。如果这一列被隐藏了,选取“显示”>“列”>“PID”。
在“终端”中,pgrep -l Safari会列出匹配的进程及其PID。ps -p <PID> -o pid,ppid,comm会显示某个进程的名称及其父进程的PID。
父进程PID能告诉你什么
除了第一个进程,每个进程都有一个父进程,也就是启动它的那个进程。在活动监视器中选取“显示”>“所有进程,分层显示”,就能以树状结构看到这些父子关系。
如何在“终端”中查找PID
“终端”中的进程名称可能和App名称不同。很多App会运行名称类似“App Helper (Renderer)”的帮助程序进程,每个都有自己的PID。
- 从“应用程序”>“实用工具”中打开“终端”。
- 运行
pgrep -lx Finder,获取名称恰好为Finder的进程的PID。去掉x,就能匹配名称的一部分。 - 如果一个App有多个进程,运行
pgrep -lf "Google Chrome",按完整命令行进行匹配。 - 要查看你自己的shell的PID,运行
echo $$。
如何查找某个PID属于哪个App
错误信息和日志文件常常只提到PID而不提名称。要查出来,运行ps -p <PID> -o pid,ppid,user,command。它会显示程序的完整路径、运行它的用户,以及其父进程的PID。
在活动监视器中,点按“PID”列标题按它排序,然后滚动到这个号码。连按该进程打开它的信息窗口,里面也会显示它的父进程。
如果ps什么都没输出,说明这个进程已经退出了。
拿到PID可以做什么
先用ps -p <PID>核对名称。PID会被重复使用,所以你之前复制的号码现在可能属于另一个进程。
kill <PID>请进程退出。kill -9 <PID>立即结束它。sample <PID> 5记录进程5秒内在做什么。lsof -p <PID>列出它打开的文件和网络连接。lsof -a -p <PID> -d cwd显示它运行所在的文件夹。top -pid <PID>显示它实时的CPU和内存占用。按q退出。
什么时候该用PID而不是名称
按名称操作的命令,比如killall Safari或pkill Safari,会作用于所有匹配的进程。默认情况下,killall会向你拥有的所有匹配进程发送退出信号,而pkill会匹配名称中包含你所输入文字的任何进程。
对单个App来说这没问题,但当很多进程同名时就有风险。一个浏览器可能运行几十个帮助程序进程,而几个node或python副本可能分属不同的项目。PID只指向一个确定的进程,所以当你只想停止其中一个、让其余的继续运行时,就用PID。
如果一定要用名称,先预览匹配结果。pgrep -l <name>会列出pkill将要作用的进程,killall -d <name>会显示killall将要做什么,但不真正发送任何信号。
常见问题
活动监视器中的PID是什么意思?
PID代表进程ID。它是每个正在运行的进程独有的号码,用来区分各个进程,也用来在“终端”命令中指定进程。
App的PID会一直不变吗?
只在它运行期间不变。退出后重新打开App,它就会得到新的PID。
Mac上的PID 1是什么?
PID 1是launchd,也就是在macOS上启动和管理其他进程的进程。永远不要退出它。
如何在Mac上按PID结束进程?
在“终端”中运行kill <PID>。如果它不退出,kill -9 <PID>会立即结束它,但可能会丢失未保存的数据。
两个进程可以有相同的PID吗?
不能同时存在。旧进程退出后,它的PID可以分配给新进程。
活动监视器中的PID 0是什么?
PID 0是kernel_task,代表macOS内核。它无法退出。
相关条目
从Windows转过来? 请看Mac上的任务管理器,或者最好用的活动监视器替代品。也可以浏览术语表中的所有条目。