M1 Mac Big Sur下Homebrew安装的Apache无法通过brew services命令关停
失效核心原因
brew services 仅通过管控关联的 launchd 服务条目实现进程启停,返回停止成功仅代表它卸载了自己托管的那一项 launchd 配置,无法管控脱离launchd托管的httpd进程,常见触发失效的场景如下:
- 残留未清理的游离httpd进程:比如曾手动执行过
sudo apachectl start启动brew安装的httpd,或是系统自带httpd未完全终止,这类进程不归属brew的launchd服务托管,brew stop命令触达不到 - launchd条目冲突:旧版本httpd卸载时未清理残留plist文件,存在多份httpd启动配置的情况下,brew仅能停止自己对应的那项条目,其他配置仍会拉起httpd进程
- 权限不匹配:若修改过brew httpd的配置指定以root系统用户运行,brew默认以普通用户身份生成的launchd条目无权限管控root权限启动的httpd进程
- M1架构路径异常:Homebrew默认安装路径为
/opt/homebrew,若存在Intel架构Homebrew残留、或是brew服务路径配置错乱,会导致它管控的plist与实际运行的httpd不是同一个实例
排查定位步骤
按顺序执行即可定位问题:
- 确认所有httpd进程的归属与启动权限
执行命令:ps aux | grep httpd
查看返回的进程路径:/usr/sbin/httpd为系统自带进程,/opt/homebrew/bin/httpd为brew安装的进程;同时核对进程启动用户是否为root。 - 核对brew services的实际托管状态
执行命令:brew services list
查看httpd行的状态标记,确认是否显示stopped、是否存在error报错,同时核对服务标签是否为homebrew.mxcl.httpd。 - 排查launchd残留冲突条目
检查以下路径下是否存在httpd相关的plist文件:~/Library/LaunchAgents//Library/LaunchDaemons//Library/LaunchAgents/
所有homebrew.mxcl.httpd.plist、apache/httpd相关的启动配置都属于潜在冲突项,先备份后删除。
- 核对httpd运行权限配置
打开brew httpd主配置文件:/opt/homebrew/etc/httpd/httpd.conf
查找User、Group配置项,若指定为root、www等系统用户,说明进程非当前普通用户启动,普通权限的brew services无法管控。
修复方案
- 先清理所有残留游离进程
执行sudo apachectl -k stop后,再执行sudo killall httpd强制终止所有httpd进程,再用ps aux | grep httpd确认无残留进程。 - 重新构建brew托管的服务链路
执行brew services stop httpd后,删除已残留的旧plist文件:rm ~/Library/LaunchAgents/homebrew.mxcl.httpd.plist
再执行brew services start httpd,重新生成launchd托管配置,确保所有httpd进程都归服务管控。 - 适配高权限运行场景
若需要httpd绑定80端口(需root权限),不要直接修改配置强制httpd以root启动,改为用sudo运行brew services:
启动:sudo brew services start httpd
停止:sudo brew services stop httpd
此时brew会将服务配置放到系统级LaunchDaemon路径下,具备管控root进程的权限。 - 彻底禁用系统自带httpd的自动拉起
执行sudo launchctl list | grep httpd,若存在系统自带的org.apache.httpd条目,执行sudo launchctl remove org.apache.httpd彻底移除,避免自动拉起冲突进程。
内容的提问来源于stack exchange,提问作者Kaenath Pryde
相关产品推荐
相关产品推荐

