Mac运行brew services出现多服务error报错的原因排查
问题现象
在Mac设备执行brew services相关命令查看服务运行状态时,返回如下结果:
dnsmasq error 512 httpd error 256 mysql@5.7 started nginx error 256 php error 19968 php@7.4 started
已尝试执行valet install、valet restart、brew services restart等操作,所有报错服务均无法恢复正常运行。
报错根因
返回的数字是服务进程启动失败的退出码,已正常显示started的mysql@5.7、php@7.4本身无配置问题,单纯重启服务无法修复的故障点对应如下:
- 错误码256(触发服务:httpd、nginx):服务默认监听的80、443等端口被其他进程占用、配置文件存在语法错误、运行目录权限不足,进程启动后立刻退出
- 错误码512(触发服务:dnsmasq):服务依赖的53端口被系统自带mDNSResponder或其他DNS程序占用、本地配置文件损坏
- 错误码19968(触发服务:php):PHP-FPM默认监听的9000端口被已正常运行的php@7.4占用、全局PHP版本与Valet配置不匹配、扩展加载异常
分步解决方案
1. 清理端口占用
先排查所有报错服务依赖端口的占用情况,终端依次执行命令:
# 排查httpd、nginx、Valet依赖的80/443端口占用 sudo lsof -i :80 -i :443 | grep LISTEN # 排查dnsmasq依赖的53端口占用 sudo lsof -i :53 | grep LISTEN # 排查php-fpm依赖的9000端口占用 sudo lsof -i :9000 | grep LISTEN
查到对应占用进程的PID后,执行sudo kill -9 <PID>杀掉占用进程即可。如果是系统自带Apache占用80/443端口,额外执行两条命令彻底关闭并禁用自启:
sudo apachectl stop sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist
2. 修复运行权限
根据芯片架构执行对应权限修复命令:
- Intel芯片Mac:
sudo chown -R $(whoami):admin /usr/local/* sudo chmod -R u+rw /usr/local/*
- M系列芯片Mac:
sudo chown -R $(whoami):admin /opt/homebrew/* sudo chmod -R u+rw /opt/homebrew/*
所有芯片通用的Valet目录权限修复命令:
sudo chown -R $(whoami):staff ~/.config/valet chmod -R u+rw ~/.config/valet
3. 修复服务配置
逐个校验并修复报错服务的配置问题:
- nginx、httpd:执行
nginx -t、httpd -t校验配置语法,根据返回的报错行提示修改对应配置文件即可,常见问题为Valet生成的站点配置存在无效路径、重复域名规则。 - dnsmasq:执行
dnsmasq --test校验配置,若提示配置文件损坏,直接删除对应路径下的配置文件后重装即可:Intel芯片路径为/usr/local/etc/dnsmasq.conf,M系列芯片路径为/opt/homebrew/etc/dnsmasq.conf,删除后执行brew reinstall dnsmasq生成默认配置。 - php:错误码19968基本为版本冲突导致,执行以下命令将全局PHP版本切换为已正常运行的php@7.4,同步Valet配置即可:
brew unlink php && brew link php@7.4 --force --overwrite valet use php@7.4
4. 重启验证
所有配置修复完成后,依次执行命令重启服务:
brew services cleanup brew services restart dnsmasq httpd nginx valet restart
执行完成后运行brew services list验证状态即可。如果仍有服务报错,直接执行brew services <报错服务名>就能看到实时启动日志,对照日志提示调整对应配置即可。
内容的提问来源于stack exchange,提问作者Arba Traf
相关产品推荐
相关产品推荐

