macos定时器日志不直接含“timer”关键词,需通过触发行为追踪:launchd任务查com.apple.xpc.launchd子系统日志,内核唤醒查com.apple.iokit.powermanagement或kernel进程日志,实时监听用log stream,验证注册需结合launchctl检查plist状态。
macos 的定时器(如 launchd 定时任务、内核 timer、i/o kit 定时器)大多通过统一日志系统记录,但不会以“timer”为关键词直接打日志。真正可追踪的是定时器触发后执行的动作——比如 launchd 启动服务、内核调度延迟、或电源管理中的 wake 周期事件。关键不是找“timer”,而是抓它引发的可观测行为。
聚焦 launchd 定时任务触发日志
绝大多数用户级和系统级定时任务由 launchd 管理,其日志集中在 subsystem com.apple.xpc.launchd 或 process launchd,触发时会记录 service name、state change 和 execution timestamp:
- 查看最近一次启动以来所有被 launchd 触发的服务(含 Periodic、StartCalendarInterval 等):
log show --predicate 'subsystem == "com.apple.xpc.launchd" AND eventMessage contains "started"' --last boot - 筛选特定服务(例如
com.apple.alarmd或你自定义的 plist 名):log show --predicate 'senderImagePath contains "launchd" AND eventMessage contains "com.yourdomain.backup"' --last 24h - 定位定时失败(如 missed、not running、throttled):
log show --predicate 'eventMessage contains "missed" OR eventMessage contains "throttled" OR eventMessage contains "not running"' --subsystem com.apple.xpc.launchd --last 7d
捕获内核级定时唤醒与电源事件
硬件级定时唤醒(如网络唤醒、RTC alarm、USB 定时轮询)会生成内核 timer 或 power management 日志,通常关联 kernel 进程或 com.apple.iokit.powermanagement 子系统:
- 查最近一次唤醒原因(含定时唤醒):
log show --predicate 'subsystem == "com.apple.iokit.powermanagement" AND eventMessage contains "wake"' --last boot | grep -i "timer\|rtc\|alarm" - 看 kernel 是否报告 timer delay 或 deadline miss(常见于 CPU 负载高导致定时不准):
log show --predicate 'process == "kernel" AND eventMessage contains "timer" OR eventMessage contains "deadline"' --last 24h - 导出完整电源状态变迁(含 sleep/wake/timer-based wake):
log show --subsystem com.apple.iokit.powermanagement --last boot --info > ~/Desktop/power-timeline.txt
用 log stream 实时监听定时动作
如果想在任务即将触发前“守株待兔”,可用 log stream 实时过滤,避免翻历史日志:
- 实时监听 launchd 所有启动动作(Ctrl+C 停止):
log stream --predicate 'subsystem == "com.apple.xpc.launchd" AND eventMessage contains "started"' --info - 监听内核 timer 相关唤醒信号(需管理员权限,建议加
sudo):sudo log stream --predicate 'process == "kernel" AND (eventMessage contains "wakeup" OR eventMessage contains "timer")' --level info - 配合时间戳确认是否准时:输出中每行开头即为精确到毫秒的时间戳,可比对计划时间是否偏移
验证定时器是否真正注册成功
日志只反映“触发结果”,不保证“定时器存在”。若怀疑定时任务没加载,先确认 plist 状态:
- 列出所有启用的定时任务:
launchctl list | grep -E "(com\..*\.|periodic)" - 检查某 plist 是否加载且有 StartCalendarInterval:
launchctl print system/com.apple.periodic-daily 2>/dev/null | grep -A5 "StartCalendarInterval" - 未加载的任务不会出现在日志里——此时应查
launchctl bootstrap是否报错,或 plist 权限/路径是否正确











