答案是使用launchd定时执行zsh脚本实现磁盘空间预警:脚本用df提取根分区使用率、去百分号后数值比较,达阈值(如85%)即调用osascript发送系统通知;配置plist每30分钟运行,路径须绝对,启用后可手动测试与日志排查。

写一个能判断并通知的 zsh 脚本
保存为 ~/bin/disk-alert.sh(需先创建目录并赋权):
#!/bin/zsh
THRESHOLD=85
ROOT_USAGE=$(df -H / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ "$ROOT_USAGE" -ge "$THRESHOLD" ]; then
osascript -e 'display notification "磁盘空间紧张:'"${ROOT_USAGE}"'% 请清理" with title "⚠️ 空间预警"'
fi
- 用
df -H /获取根分区数据,awk 'NR==2'提取实际使用行,sed 's/%//'去掉百分号才能数值比较 -
osascript调用系统通知,无需安装额外组件 - 想监控其他卷(如
/Volumes/Backup),把df -H /中的/换成对应路径即可
配置 launchd 每 30 分钟自动运行
新建 plist 文件:~/Library/LaunchAgents/com.user.diskalert.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.diskalert</string>
<key>ProgramArguments</key>
<array>
<string>/bin/zsh</string>
<string>/Users/yourname/bin/disk-alert.sh</string>
</array>
<key>StartInterval</key>
<integer>1800</integer>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
-
StartInterval设为 1800 秒即 30 分钟;RunAtLoad表示登录时就启用 - 路径必须用绝对路径,
/Users/yourname替换为你自己的用户名 - 脚本要可执行:
chmod +x ~/bin/disk-alert.sh
加载并验证任务是否生效
在终端运行:
-
launchctl load ~/Library/LaunchAgents/com.user.diskalert.plist(启用) -
launchctl start com.user.diskalert(立即手动触发一次测试) -
log show --predicate 'process == "disk-alert.sh"' --last 1m(查最近一分钟日志,看有无报错)
若通知没弹出,常见原因:脚本权限不足、路径写错、终端没获得「完全磁盘访问权限」(系统设置 → 隐私与安全性 → 完全磁盘访问权限中添加 Terminal.app)。
补充提醒:避免误判和干扰
- 阈值建议设为 80–85%,留出缓冲空间;低于 80% 一般不影响系统运行
- 不要用 cron —— macOS Catalina 起默认禁用,且 cron 进程本身需额外授权,不稳定
- 脚本里别写
echo或printf到终端,launchd 不连接交互会话,输出会被丢弃 - 如果同时用了 Time Machine 本地快照,
df显示的空间可能含快照占用,属正常现象


















