macOS launchd CPU 占用过高问题排查记录

macOS launchd CPU 占用过高问题排查记录

问题现象

MacBook 出现以下异常:

  • launchd CPU 长时间占用 100%~300%
  • logd CPU 也持续较高
  • 风扇高速运转(Intel Mac)或机器发热(Apple Silicon)
  • 即使退出 Cursor,CPU 仍然没有下降

最初怀疑:

  • Cursor
  • VSCode
  • 网络代理
  • 某个后台进程不断拉起

最终证明以上均不是根因。


排查过程

1. 查看 launchd

css 复制代码
 top -o cpu

发现:

复制代码
 launchd
 logd

长期排在 CPU 前列。


2. 查看 launchd 的 syscall

使用

复制代码
 sudo fs_usage launchd

发现不停输出:

csharp 复制代码
 lstat64 private/etc/localtime
 sendto()
 lstat64 private/etc/localtime
 sendto()
 ...

说明:

launchd 一直在:

  • 查询时区
  • 向某个 socket 发消息
  • 写日志

形成死循环。


3. 查看 launchd 打开的文件

css 复制代码
 sudo lsof -p 1

发现:

c 复制代码
 FD 5
 ​
 /private/var/log/com.apple.xpc.launchd/launchd.log

说明 launchd 正在疯狂写日志。


4. 查看 launchd 日志

bash 复制代码
 sudo tail -100 \
 /private/var/log/com.apple.xpc.launchd/launchd.log

发现大量重复内容:

bash 复制代码
 (gui/501/com.sogou.SogouTaskManager)
 ​
 cannot spawn:
 service plist has the quarantine extended attribute

紧接着:

复制代码
 assertion failed

整个日志几乎全部由这一条组成。


根因分析

真正的问题不是 Cursor。

真正的问题是:

复制代码
 com.sogou.SogouTaskManager

即:

搜狗输入法后台服务。

launchd 不断尝试启动它:

erlang 复制代码
 launchd
         │
         ▼
 启动 SogouTaskManager
 ​
         │
         ▼
 启动失败
 ​
 原因:
 ​
 service plist has the quarantine extended attribute
 ​
         │
         ▼
 launchd 认为 KeepAlive 服务退出
 ​
         │
         ▼
 再次启动
 ​
         │
         ▼
 再次失败
 ​
 ...
 ​
 无限循环

于是:

复制代码
 launchd CPU ↑
 ​
 ↓
 ​
 不停写日志
 ​
 ↓
 ​
 logd CPU ↑
 ​
 ↓
 ​
 整个系统 CPU 很高

为什么会失败?

日志中的关键错误:

复制代码
 service plist has the quarantine extended attribute

说明:

LaunchAgent 或其对应文件带有:

复制代码
 com.apple.quarantine

扩展属性。

这是 macOS 的安全机制。

通常来源:

  • 浏览器下载
  • AirDrop
  • 第三方安装包
  • 手动复制 App
  • 升级后遗留文件

launchd 检测到:

此服务处于 quarantine 状态,不允许启动。

但是 LaunchAgent 又配置了:

ini 复制代码
 KeepAlive = true

于是:

复制代码
 失败
 ​
 ↓
 ​
 再次启动
 ​
 ↓
 ​
 再次失败
 ​
 ↓
 ​
 无限循环

为什么 logd 也会很高?

因为:

每次启动失败都会记录日志:

c 复制代码
launchd

↓

syslog

↓

logd

↓

写 launchd.log

所以:

复制代码
launchd CPU 高

↓

logd CPU 也高

这是结果,而不是原因。


Cursor 为什么不是根因?

虽然最开始怀疑 Cursor:

  • Cursor 经常启动大量后台进程
  • AI 插件可能频繁创建子进程

但是:

关闭 Cursor 后:

复制代码
launchd CPU

没有下降

并且 launchd 日志全部指向:

复制代码
com.sogou.SogouTaskManager

因此可以排除 Cursor。


后续排查建议

查看 LaunchAgent

bash 复制代码
launchctl print gui/501/com.sogou.SogouTaskManager

查找 plist

javascript 复制代码
find ~/Library /Library \
-name "*SogouTaskManager*.plist" 2>/dev/null

通常位于:

javascript 复制代码
~/Library/LaunchAgents/

或:

复制代码
/Library/LaunchAgents/

查看 quarantine 属性

javascript 复制代码
xattr -l \
~/Library/LaunchAgents/com.sogou.SogouTaskManager.plist

或者:

复制代码
xattr -l /Applications/SogouInput.app

如果看到:

复制代码
com.apple.quarantine

即可确认问题。


临时停止服务

bash 复制代码
launchctl bootout gui/501/com.sogou.SogouTaskManager

或者:

javascript 复制代码
launchctl unload \
~/Library/LaunchAgents/com.sogou.SogouTaskManager.plist

如果 CPU 立即下降,则进一步验证问题来源。


修复方式

方法一(推荐)

重新安装最新版搜狗输入法。

这样可以同时修复:

  • LaunchAgent
  • plist
  • 权限
  • 签名
  • quarantine 状态

这是最稳妥的方法。


方法二

移除 quarantine 属性:

复制代码
sudo xattr -dr \
com.apple.quarantine \
/Applications/SogouInput.app

或者:

javascript 复制代码
xattr -d \
com.apple.quarantine \
~/Library/LaunchAgents/com.sogou.SogouTaskManager.plist

仅建议在确认文件来源可信时使用。


排查思路总结

scss 复制代码
CPU 高
    │
    ▼
launchd 高
    │
    ▼
查看 syscall
(fs_usage)
    │
    ▼
不停 sendto()
不停 lstat()
    │
    ▼
查看 lsof
    │
    ▼
发现 launchd.log
    │
    ▼
查看日志
    │
    ▼
发现:

com.sogou.SogouTaskManager

cannot spawn

service plist has the quarantine extended attribute

    │
    ▼
确定:

LaunchAgent 无限重启

    │
    ▼
launchd CPU 高

    │
    ▼
logd CPU 高

结论

本次问题的直接原因是:

搜狗输入法(com.sogou.SogouTaskManager)对应的 LaunchAgent 无法启动,因为其 plist(或关联文件)带有 com.apple.quarantine 扩展属性。由于 LaunchAgent 配置了自动保活(KeepAlive),launchd 持续尝试重启该服务,导致陷入无限重启循环,从而造成 launchdlogd CPU 长时间占用过高。

Apple 的 launchd 会负责管理 LaunchAgent/LaunchDaemon,当配置了保活策略时,只要服务异常退出,就会持续尝试重新启动。若启动失败的原因(如 quarantine、签名、权限等)一直存在,就会形成重启风暴(restart storm)。相关行为与 launchd 的服务管理机制一致。

相关推荐
安且惜14 小时前
Windows或mac支持本地抓包
windows·macos
做萤石二次开发的哈哈1 天前
开发者如何调用 ERTC iOS API 完成 SDK 初始化配置?
macos·objective-c·cocoa
AUV11071 天前
Mac 录屏自动缩放怎么设置才不乱跳:自动片段、固定区域与鼠标跟随调试
macos·计算机外设
程序员良辰1 天前
【Mac快速切换JDK】Mac 使用 Homebrew + jenv 快速切换 JDK 版本
java·开发语言·macos
coding4u2 天前
Mac 外接显示器完全指南:从插上线到调好每个参数
macos·计算机外设·文件管理·显示器·策略模式·quick look扩展
zhyf1192 天前
(Mac)Homebrew部署Obsidian+Claudian+Excalidraw
macos
chuan.bai2 天前
Java RAG 实战(第 3 篇):从交互式聊天到多轮上下文
java·人工智能·macos·ai
Chennn__2 天前
开源项目:Recorder — 本地离线 macOS 录音转文字(通用/课堂/雅思,可选 Ollama)
macos
AUV11072 天前
录系统声音用什么 Mac 录屏软件:双音源到成片的五层验收
macos
chuan.bai2 天前
Java RAG 实战专栏导读:从零跑通 Ollama + Qdrant + Spring Boot 知识库
java·人工智能·macos·ai