1. 场景还原
在 Mac 上用 ZeroTier 搭了内网穿透,基于某些原因卸载重装后,再次打开软件无法正常使用,一直提示以下信息:
Waiting for ZeroTier service...
2. 出错原因
背后的原因,其实不是 ZeroTier 自身安装出了 bug,而是 macOS 的服务管理机制 launchd
没有正确加载 ZeroTier 的后台服务。
更细一点说:
-
ZeroTier 在 macOS 上的后台是通过一个叫
com.zerotier.one.plist
的配置文件来托管的,这个文件放在/Library/LaunchDaemons/
下。 -
第一次装的时候,它会被
launchd
正常管理;但卸载时,可能残留了一些 持久化配置(override),比如服务被标记成禁用。 -
重新安装后,虽然
.plist
又回来了,但launchd
并不会自动刷新之前的状态,导致 ZeroTier 服务并没有被真正加载。
结果就是:前台的ZeroTier一直在等后台服务响应,但后台压根没起来,于是就一直提示“Waiting for ZeroTier service”。
3. 解决方法
解决办法其实很简单,只要手动把服务加载到 launchd
里,并且设置成开机自启就行:
sudo launchctl load -w /Library/LaunchDaemons/com.zerotier.one.plist
-
launchctl load
:告诉 macOS 把这个守护进程配置文件读进来,启动服务。 -
-w
:写入持久化设置,确保以后开机也会自动启动 ZeroTier。
运行完这个命令之后,再次打开ZeroTier软件就能正常运行。
4. 知识拓展
macOS 的 launchd 与 plist
在 macOS 里,launchd
是系统的“管家”,它从系统启动的第一刻起就在后台运行,负责统一管理各种服务和进程。可以把它类比成 Linux 的 systemd 或 Windows 的服务管理器。
而 .plist
文件(Property List 的缩写),就是 launchd
的说明书。
-
它用 XML 格式定义了一个服务的启动方式、运行命令、是否随开机启动、日志输出等信息。
-
按存放位置不同,分为:
-
/System/Library/LaunchDaemons/
:系统自带的守护进程 -
/Library/LaunchDaemons/
:所有用户共享的第三方守护进程(比如 ZeroTier) -
~/Library/LaunchAgents/
:只针对当前用户的服务或应用
-
简单来说:
launchd
就是服务调度员,.plist
就是服务说明书。
你把说明书交给调度员,它才知道什么时候、怎么帮你把服务跑起来。
launchctl
常用命令(macOS 服务管理)
1. 加载 / 卸载服务
# 加载服务(使其生效)
sudo launchctl load /Library/LaunchDaemons/xxx.plist
# 加载并写入持久化设置(开机自启)
sudo launchctl load -w /Library/LaunchDaemons/xxx.plist
# 卸载服务(停止并移除)
sudo launchctl unload /Library/LaunchDaemons/xxx.plist
# 卸载并移除持久化设置(取消开机自启)
sudo launchctl unload -w /Library/LaunchDaemons/xxx.plist
-w
代表 write override,也就是修改系统对该服务的持久化启用/禁用状态。
2. 查看服务状态
# 查看所有服务(很长,可以加 grep 过滤)
launchctl list
# 查看某个具体服务
launchctl list | grep zerotier
# 查看当前用户的服务
launchctl print gui/$(id -u)
# 查看系统级服务
sudo launchctl print system
3. 启动 / 停止服务
# 启动某个服务
sudo launchctl start com.zerotier.one
# 停止某个服务
sudo launchctl stop com.zerotier.one
注意:start/stop
只是临时生效,不会影响下次开机。
4. 检查 / 调试
# 检查服务配置文件
plutil /Library/LaunchDaemons/com.zerotier.one.plist
# 查看服务详细信息,如果服务有错误,会在这里看到状态码或日志
sudo launchctl print system/com.zerotier.one
5. 其它
# 重新加载 launchctl 的配置(类似刷新)
sudo launchctl kickstart -k system/com.zerotier.one
# 移除某个服务的 override 设置(恢复默认)
sudo launchctl enable system/com.zerotier.one
sudo launchctl disable system/com.zerotier.one
总结
重装 ZeroTier 后一直提示“Waiting for service”,其实是 launchd
和 .plist
没有对上号。只要手动 launchctl load -w
一下,把服务重新登记,问题就迎刃而解。
这也给我们一个启发:在 macOS 里,后台服务跑不动的时候,记得去看看是不是 launchd
那里没安排好排班表。