在macOS上用launchd定时检测磁盘空间并通知:编写zsh脚本判断根分区使用率≥85%时调用osascript发送系统通知,配置plist每30分钟执行一次,路径须用绝对路径,启用后可手动测试与日志排查。

在 macOS 上用 df 定时检测磁盘空间并自动通知,关键在于:用 launchd 替代 cron(macOS 推荐方式)、脚本中准确判断阈值、通过系统通知或邮件触达用户。不依赖第三方工具,原生可靠。
编写空间检查脚本
保存为 ~/bin/disk-alert.sh(需先创建目录并赋执行权限):
确保脚本第一行是 #!/bin/zsh(macOS 默认 shell),内容示例如下:
#!/bin/zsh<br>THRESHOLD=85 # 警戒线:使用率 ≥85% 触发<br>ROOT_USAGE=$(df -H / | awk 'NR==2 {print $5}' | sed 's/%//')<br>if [ "$ROOT_USAGE" -ge "$THRESHOLD" ]; then<br> osascript -e "display notification \"磁盘空间紧张:${ROOT_USAGE}%\" with title \"⚠️ 空间预警\""<br> # 可选:同时发邮件(需配置本地 mail 命令)<br> # echo "根分区已使用 ${ROOT_USAGE}%,请及时清理。" | mail -s "【Mac 空间告警】" your@email.com<br>fi
说明:
- 用
df -H /获取根分区数据,awk 'NR==2'提取第二行(实际使用行) sed 's/%//'去掉百分号,才能用-ge正确比较数字osascript调用 AppleScript 发送系统通知,无需额外安装- 如需监控其他卷(如
/Volumes/Data),替换df -H /中的路径即可
配置 launchd 定时任务
创建 plist 文件:~/Library/LaunchAgents/com.user.diskalert.plist
内容如下(每30分钟检查一次):
<?xml version="1.0" encoding="UTF-8"?><br><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><br><plist version="1.0"><br><dict><br> <key>Label</key><br> <string>com.user.diskalert</string><br> <key>ProgramArguments</key><br> <array><br> <string>/bin/zsh</string><br> <string>/Users/yourname/bin/disk-alert.sh</string><br> </array><br> <key>StartInterval</key><br> <integer>1800</integer> <!-- 1800秒 = 30分钟 --><br> <key>RunAtLoad</key><br> <true/><br></dict><br></plist>
启用任务:
- 终端运行:
launchctl load ~/Library/LaunchAgents/com.user.diskalert.plist - 立即手动触发测试:
launchctl start com.user.diskalert - 查看日志是否报错:
log show --predicate 'process == "disk-alert.sh"' --last 1h
验证与调优建议
避免误报和漏报,注意以下细节:
- 脚本路径必须写绝对路径(launchd 不继承 shell 的 PATH 和 ~ 展开)
-
首次运行前,手动执行脚本测试通知是否弹出(
zsh ~/bin/disk-alert.sh) - 若需更高精度(如排除 Time Machine 本地快照占用),改用
df -H -x apfs | grep '^/'过滤 - 通知频率不宜过密,
StartInterval建议不低于 600(10 分钟),防止干扰 - 可扩展逻辑:添加
du -sh /var/log/* | sort -hr | head -3找出最大日志目录,一并通知
替代方案说明(按需选用)
如果 launchd 配置复杂,可临时用更轻量的方式:
- Automator 应用 + 日历提醒:用 Automator 新建“运行 Shell 脚本”操作,保存为 App,再在“日历”中创建重复提醒,触发该 App
- Alfred Workflow:适合常驻 Alfred 用户,用内置定时器调用脚本+通知
- 不推荐 cron:macOS 10.12+ 对 cron 支持弱化,且无法直接触发 GUI 通知(需额外处理环境变量)

















