查询和清空 macOS 目录服务缓存,配合 mDNSResponder 刷新 DNS。
dscacheutil 操作的是 DirectoryService 缓存,覆盖用户、组、主机、服务等条目。常用两类操作:-q 类别 -a 键 值 按系统视角查询,例如 -q host -a name example.com、-q user -a name root;-flushcache 清空缓存。它查询时会经过 mDNSResponder,因此能看到 /etc/hosts、Bonjour 和 VPN scoped resolver 的结果,这一点和直接问 DNS 服务器的 dig 不同。
版本差异要分清:Mac OS X 10.6 起 dscacheutil 取代了旧的 lookupd,老教程里的 lookupd -flushcache 已不适用。macOS 10.15 以后 DNS 缓存主要由 mDNSResponder 持有,只跑 dscacheutil -flushcache 往往清不干净,通行做法是两条一起执行:sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder。-HUP 让 mDNSResponder 重读配置并清缓存,不是杀死进程;不要用 kill -9。
清缓存只能解决“本机缓存了旧记录”,不能解决权威 DNS 配错、VPN 分流错误或应用自己的缓存。浏览器、Java、Go 等运行时可能各自缓存 DNS,刷新系统缓存后仍需重启应用或清应用内缓存。-flushcache 成功时没有输出,不要因为“没打印成功”而重复执行。
# 按系统解析视角查主机,能看到 hosts 和 DNS 的综合结果
% dscacheutil -q host -a name example.com
# 查 Bonjour/mDNS 主机名
% dscacheutil -q host -a name printer.local
# 查本地用户记录
% dscacheutil -q user -a name root
# 查组记录
% dscacheutil -q group -a name staff
# 查看目录服务缓存配置和搜索策略
% dscacheutil -configuration
# 查看缓存统计
% dscacheutil -statistics
# 刷新目录服务缓存,并让 mDNSResponder 重读配置
% sudo dscacheutil -flushcache
% sudo killall -HUP mDNSResponder
# 验证刷新后系统看到的新记录
% dscacheutil -q host -a name example.com
dscacheutil -flushcache 后旧 DNS 仍生效:再执行 sudo killall -HUP mDNSResponder,两者清的是不同层缓存。sudo kill -9 mDNSResponder 强制杀进程会中断解析,虽然 launchd 会拉起,但应使用 -HUP 平滑重载。-flushcache 没有成功输出是正常的;用 dscacheutil -q host -a name 域名 或重新访问服务验证,而不是反复刷新。-q host 可能同时返回 IPv4 和 IPv6 多条记录,脚本解析要按字段取值,不能假设只有一行。-a 查询 user/group 会枚举大量条目,既慢又可能暴露无关信息;始终用 -a name 值 缩小范围。dig 可能查不到内网域名,而 dscacheutil 能按系统 resolver 顺序查到;两者结果不一致时以系统解析路径为准。.local 依赖 mDNS,某些网络禁用多播;此时 dscacheutil 也可能失败,用 dns-sd -G v4 主机名.local 进一步确认。chrome://net-internals/#dns 清理,其他应用通常需要重启。dig — 直接向 DNS 服务器查询,绕过系统缓存nslookup — 快速查询单条记录ifconfig — 确认接口和 DNS 所在网络是否正常tcpdump — 抓 53 端口确认查询是否真的发出合上页面,先回答,再展开对照。
dscacheutil -q host 和 dig 的结果为什么会不一样?killall -HUP mDNSResponder 会不会中断 DNS 服务?kill -9。
小程序版
微信扫码,随时查命令