macOS批量启停服务需区分Launch Agents(用户级)和Launch Daemons(系统级):用户级用launchctl load/unload -w操作~/Library/LaunchAgents/下plist,无需sudo;系统级仅限/Library/LaunchDaemons/中明确列表的服务,须sudo且确保root:wheel权限与644模式,禁用SIP保护路径。
macos 批量启停系统服务,核心是围绕 launchctl 对 launch agents(用户级)和 launch daemons(系统级)进行统一操作。关键不在于写复杂脚本,而在于分清层级、避免越权、确保路径与权限正确。下面提供两个实用、安全、可直接运行的脚本方案。
批量启动/停止用户级代理(Launch Agents)
这类服务属于当前登录用户,配置文件在 ~/Library/LaunchAgents/,无需 sudo,适合日常清理或重置常用工具(如飞书、ToDesk、Alfred 等)。
- 新建脚本:
nano ~/start-agents.sh,粘贴以下内容:
#!/bin/bash
for plist in ~/Library/LaunchAgents/*.plist; do
[ -f "$plist" ] && launchctl load -w "$plist" 2>/dev/null
done
echo "✅ 已尝试加载所有用户级代理"
- 同理,停用脚本:
nano ~/stop-agents.sh:
#!/bin/bash
for plist in ~/Library/LaunchAgents/*.plist; do
[ -f "$plist" ] && launchctl unload -w "$plist" 2>/dev/null
done
echo "✅ 已尝试卸载所有用户级代理"
- 赋予执行权限并运行:
chmod +x ~/start-agents.sh ~/stop-agents.sh,然后执行~/start-agents.sh - 注意:
-w会写入启用/禁用状态到 plist 文件中,下次登录自动生效;2>/dev/null屏蔽报错(如已加载的服务重复 load)
安全批量管理指定系统服务(推荐方式)
系统级服务存于 /Library/LaunchDaemons/,修改需 sudo,且必须确保文件属主为 root:wheel、权限为 644。不建议无差别操作 /System/Library/LaunchDaemons/(SIP 保护,不可修改)。
部署和使用军舰的 macOS Automator 自动化服务集合。包含 5 个实用工作流:PDF转JPG、PNG重命名并转JPG、图像拼接、解压RAR、顺序命名图像文件。一键安装所有服务到 ~/Library/Services/ 目录。使用场景:(1) "安装我的自动化服务",(2) "部署所有 Automato...
- 创建可控列表,例如只管理 brew 安装的服务:
nano ~/manage-daemons.sh - 内容示例(以 redis、nginx 为例):
#!/bin/bash
SERVICES=(
"homebrew.mxcl.redis"
"homebrew.mxcl.nginx"
)
case "$1" in
"start")
for svc in "${SERVICES[@]}"; do
sudo launchctl load -w "/usr/local/opt/$svc/homebrew.mxcl.$svc.plist" 2>/dev/null
echo "→ 启用 $svc"
done
;;
"stop")
for svc in "${SERVICES[@]}"; do
sudo launchctl unload -w "/usr/local/opt/$svc/homebrew.mxcl.$svc.plist" 2>/dev/null
echo "→ 停用 $svc"
done
;;
*)
echo "用法:$0 {start|stop}"
exit 1
;;
esac
- 使用方式:
chmod +x ~/manage-daemons.sh,然后运行~/manage-daemons.sh start - 优势:显式声明服务名,不扫描未知 plist,规避权限错误与 SIP 冲突
快速验证与故障排查辅助命令
脚本运行后,用这些命令确认结果是否符合预期:
- 查看当前用户所有活跃代理:
launchctl list | grep -v "0x" - 检查某服务是否运行(如 redis):
launchctl list | grep redis→ 显示状态码 0 表示正常 - 确认系统级服务加载路径是否合法:
ls -l /Library/LaunchDaemons/ | grep redis→ 应显示 root:wheel 和 -rw-r--r-- - 语法校验 plist(防脚本静默失败):
plutil -lint /path/to/file.plist
脚本本身不复杂,但容易忽略归属、权限、SIP 限制和 Label 与文件名的区别。优先处理用户级,系统级操作前先备份 plist,再小范围测试。

















