推荐用 launchd 定时执行 zsh 脚本监控 macos 磁盘空间:以 df -h / 提取根分区使用率,用 osascript 发送通知;脚本需用 #!/bin/zsh、正确解析 df 输出、数值比较用 -ge;plist 文件须用绝对路径,startinterval 设 1800 秒。
macos 系统监控磁盘空间,关键在于用原生机制可靠触发预警,而不是等系统弹出“磁盘已满”才反应。推荐使用 launchd 定时执行 zsh 脚本,配合 df 提取使用率、osascript 发送通知,全程无需第三方工具,稳定且低侵入。
脚本编写要点:准确提取根分区真实使用率
macOS Catalina 之后采用 APFS 分层结构,/ 是只读宗卷,实际数据落在 /System/Volumes/Data。但日常空间预警仍应以 df -H / 为准——它反映的是用户可写空间(即 Data 宗卷)的占用情况,与系统设置中显示的“可用空间”逻辑一致。
脚本中需注意:
- 用
df -H / | awk 'NR==2 {print $5}' | sed 's/%//'提取第二行第五列(避免表头干扰),并剔除百分号 - 阈值比较必须用
-ge(而非>=),因 shell 中数值比较不支持符号写法 - 脚本首行固定为
#!/bin/zsh,macOS 默认 shell 是 zsh,用 bash 可能导致权限或路径异常
定时任务配置:用 launchd 替代 cron
macOS 已弃用 cron 的部分功能,官方推荐 launchd。需创建 plist 文件(如 ~/Library/LaunchAgents/com.user.diskalert.plist),内容包含:
-
Label:唯一标识名 -
ProgramArguments:指定脚本绝对路径(例如~/bin/disk-alert.sh必须展开为/Users/xxx/bin/disk-alert.sh) -
StartInterval:设为 1800(秒),即每 30 分钟执行一次 -
RunAtLoad:设为true,开机/登录即启用
启用后运行 launchctl load ~/Library/LaunchAgents/com.user.diskalert.plist,再用 launchctl start com.user.diskalert 手动触发一次测试。
利用 macOS 原生能力实现本地语音识别与合成。通过 yap (Apple Speech.framework) 进行语音转文字,通过 say + ffmpeg 进行文字转语音。完全离线,无需 API 密钥。具备音质检测与智能选声功能。
通知方式选择:系统通知优先,邮件为辅
对大多数用户,osascript -e 'display notification ...' 最轻量、最及时,点击即可跳转到“关于本机→存储空间”界面。
若需留痕或多人协同运维,可补充邮件通知:
- 确保已配置本地
postfix或使用mail命令对接外部 SMTP(如 Gmail App Password) - 邮件正文建议包含时间戳、当前使用率、挂载点及简明清理提示(例如:“请检查 ~/Library/Caches 或 /private/var/folders”)
- 避免高频发送,可在脚本中加入“上次告警时间缓存文件”,24 小时内同类告警仅发一次
排查常见失效原因
脚本部署后无响应?重点检查以下几项:
- 脚本是否添加执行权限:
chmod +x ~/bin/disk-alert.sh - plist 中路径是否全为绝对路径(
~不会被 launchd 展开) - 手动运行脚本是否报错(在终端直接执行,观察输出)
- 查看日志:
log show --predicate 'subsystem == "com.user.diskalert"' --last 1h - 确认未被“低电量模式”或“电池优化”后台限制(M系列 Mac 上 launchd 任务默认不受影响,但老旧 Intel Mac 在电池模式下可能延迟执行)










