macOS可通过scutil监听网络配置变化、执行缓存清理脚本,并用launchd的WatchPaths监控/resolv.conf实现自动触发;需包含DNS/HTTP/内容缓存清理及锁机制与日志记录。
macos 本身不提供“网络切换时自动运行脚本”的原生机制,但可通过监听网络状态变化 + 自定义脚本 + 系统服务(launchd)组合实现。关键不在“配置网络切换”,而在“检测网络切换并触发清理动作”。整个流程需三部分协同:状态检测、缓存清理、服务托管。
监听网络接口状态变化
macOS 没有类似 Linux 的 ifup/ifdown 钩子,但可用以下方式可靠感知网络变更:
-
使用
networksetup -listnetworkserviceorder结合ipconfig getifaddr或route get default判断主接口是否变化(如从 Wi-Fi 切到 Ethernet) -
监听
systemconfiguration通知:通过scutil --monitor实时捕获 DNS、ServiceOrder、IPv4 等配置变动(最推荐,响应快且轻量) - 避免轮询
ifconfig或ping——低效且易误判
定义需清理的缓存类型及对应命令
不同网络场景下,应清理不同缓存,脚本中需按需组合:
部署和使用军舰的 macOS Automator 自动化服务集合。包含 5 个实用工作流:PDF转JPG、PNG重命名并转JPG、图像拼接、解压RAR、顺序命名图像文件。一键安装所有服务到 ~/Library/Services/ 目录。使用场景:(1) "安装我的自动化服务",(2) "部署所有 Automato...
-
DNS 缓存(必清):
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder(兼容 macOS 10.10+) -
HTTP/HTTPS 缓存(Safari、WebKit):删除
~/Library/Caches/com.apple.Safari/和~/Library/Caches/com.apple.WebKit*/下近期修改的缓存目录(建议用find ... -mtime -1 -delete控制范围) -
内容缓存(Apple Content Cache):若启用局域网内容缓存服务,可执行
sudo assetcacheadmin --flush-all(仅限 macOS Server 或开启 Content Caching 的设备) -
自定义应用缓存(如 Docker、Nginx、Homebrew services):在脚本中显式调用其清理命令(如
brew services cleanup)
用 launchd 实现事件驱动自动触发
不能靠定时任务(launchd 的 StartInterval),而要用 WatchPaths 或 QueueDirectories 监听系统配置文件变化。实际可行方案是:
- 创建一个 shell 脚本(如
/usr/local/bin/network-switch-clean.sh),包含上述检测逻辑与清理命令 - 编写
plist文件(如~/Library/LaunchAgents/local.network-switch-clean.plist),设置:<key>WatchPaths</key><array><string>/private/var/run/resolv.conf</string></array>
(该文件由configd在 DNS 或服务顺序变更时更新,稳定可靠) - 加载服务:
launchctl load ~/Library/LaunchAgents/local.network-switch-clean.plist
增强健壮性的小技巧
避免重复执行或权限失败:
- 脚本开头加锁机制(如
mkdir /tmp/.network_clean_lock 2>/dev/null || exit,结尾rmdir /tmp/.network_clean_lock) - 所有
sudo命令前检查当前用户是否在admin组,或提前配置免密sudoers(如%admin ALL=(ALL) NOPASSWD: /usr/bin/dscacheutil, /usr/bin/killall) - 记录日志到
~/Library/Logs/network-switch-clean.log,便于排查触发时机与失败原因

















