代理软件启动比脚本慢——macOS 系统代理自动恢复方案

现象

macOS 登录后,系统代理(HTTP/HTTPS)处于关闭状态。手动检查发现代理软件进程已经在跑,端口可达,但系统代理就是没开。

根因

我有一个 LaunchAgent 脚本,在登录时自动检测代理软件端口是否可达,可达就开代理,不可达就关代理。

问题出在时序:代理软件启动需要 10-30 秒,但 LaunchAgent 在登录后几乎立即执行。脚本跑的时候端口还没起来,于是判定”不可达”,把代理关了。之后脚本不再重新执行,代理就一直关着。

旧版逻辑:

端口可达 → 保持当前状态(当时是关的,所以一直关)
端口不可达 → 关闭代理

修复

脚本 v2

改为主动启用逻辑:

端口可达 → 主动启用代理(不管当前状态)
端口不可达 → 关闭代理

关键改动就一行:端口可达时不再”保持现状”,而是显式执行 networksetup -setwebproxystatenetworksetup -setsecurewebproxystate 设为 On。

LaunchAgent 加轮询

旧版只在登录时跑一次。新版加了每 5 分钟重新检测:

<key>StartInterval</key>
<integer>300</integer>

这样即使代理软件延迟启动或中途重启,5 分钟内代理就能自动恢复。

验证

修复后立即测试:

HTTP 代理:  Enabled: Yes ✓
HTTPS 代理: Enabled: Yes ✓

教训

时序问题是最难调试的 bug 之一。脚本本身的逻辑没有错,错在执行时机。如果你的 LaunchAgent 依赖某个服务,永远不要假设它在登录时已经就绪。要么加 StartInterval 轮询,要么加 WatchPaths 监听服务就绪信号。