今天在终端收到一封 cron 发来的邮件,说某个脚本 “Operation not permitted”。查下去是两个问题合在一起,顺手也把 cron 和 launchd 在 macOS 上的差别重新过了一遍。
先看今天这件事
我有三个用 cron 跑的定时任务:每小时 15 分把知识库备份到 git,每小时 20 分刷新知识库的向量索引,每天早 9 点跑一次健康检查。
有一天开始,前两个任务悄无声息失败。打开日志才看见:
/bin/bash: .../brain-git-backup.sh: Operation not permitted
/bin/bash: gbrain: command not found
第一个是权限拦截——脚本文件在 ~/Library/CloudStorage/Dropbox/ 里,macOS 的隐私系统(TCC)不让 cron 碰 iCloud、Dropbox 这种云端同步目录下的文件。
第二个是 PATH 问题。cron 跑的 bash 是个干净的非交互 shell,.zshrc 里配置的 PATH 不会加载,gbrain 找不到。
cron 和 launchd 是什么
两者都是"定时工具"——让系统在指定时间跑一段命令。
cron 是 Unix 时代的老工具,几十年历史,Linux、Mac 都有,写一行配置就能用。
launchd 是苹果自己做的调度系统,2005 年随 macOS 10.4 推出。现在苹果系统里所有后台服务,包括 cron 本身,都归 launchd 管。