系统学习 macOS 学习路径:从 BSD 文件命令到系统、网络与开发维护

lsof

按进程、端口或文件反查 macOS 上谁打开了它。

补充说明

lsof 列出进程打开的文件描述符,包括普通文件、目录、管道、套接字和设备。网络排障最常用的是把端口映射到 PID:lsof -nP -iTCP:8080、lsof -nP -iTCP -sTCP:LISTEN。它也能回答“这个外接盘为什么卸不掉”“谁占着日志文件”,比 netstat 多了进程维度。

-n 禁止地址反解,-P 禁止端口名转换,两者几乎应该常带,否则 DNS 或 /etc/services 会让输出变慢且难比对。默认只显示当前用户可见的进程,查系统进程或其他用户的进程要加 sudo;部分受保护的系统进程即使 sudo 也可能信息不全,这是正常边界。

macOS 自带的是 Apple 维护的 lsof 4.91,版本比上游旧,个别新选项不存在。输出里的 COMMAND 默认截断到 9 个字符,可用 +c 0 显示完整命令名。lsof +D 会递归扫描目录,在大目录或网络卷上非常慢,能定位到具体文件时优先 lsof /path/to/file。

常用示例

# 查看所有 TCP 监听端口及对应进程
% lsof -nP -iTCP -sTCP:LISTEN

# 查谁占用了 8080 端口
% lsof -nP -i :8080

# 查看某进程打开的所有文件
% lsof -p 462

# 查看某进程完整命令名,避免 9 字符截断
% lsof +c 0 -p 462 | head

# 只输出占用 3000 端口的 PID,确认后再 kill
% lsof -t -i :3000

# 查某个文件被谁打开
% lsof /etc/hosts

# 查看 UDP 套接字
% lsof -nP -iUDP

# 需要看其他用户或系统进程时加 sudo
% sudo lsof -nP -iTCP -sTCP:LISTEN

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. lsof -nP -iTCP -sTCP:LISTEN 中 -n 和 -P 各避免什么?
  2. 怎样查 8080 端口被哪个 PID 占用,并在动手前确认?
  3. 为什么 lsof +D 不建议随意使用?
答案
  1. -n 禁止 IP 地址反解,-P 禁止端口号转服务名;两者都能避免 DNS/服务查询造成的延迟和输出歧义。
  2. 先 lsof -nP -i :8080 看进程名和 PID,确认无误后再 kill -TERM <PID>;不要盲目批量 kill。
  3. 它会递归遍历目录下所有文件,在大目录、APFS 快照或网络卷上非常慢;能定位具体文件时直接用 lsof /path/file。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令