Mac上crontab不执行的根源是系统隐私策略拦截,需先启用cron服务并为/usr/sbin/cron授予完全磁盘访问权限,再配置含绝对路径和完整重定向的定时任务。

你在Mac上写好了crontab定时任务,但脚本始终不执行、日志为空、报错“Operation not permitted”,根本原因是cron进程被macOS系统级隐私策略拦截,既读不到你的脚本,也写不了日志文件。必须同时完成任务配置与权限授权两步,缺一不可。
确认cron守护进程是否已加载并运行
macOS自Catalina(10.15)起默认禁用cron,即使你编辑了crontab,服务未启动就等于没写。
打开终端,执行:sudo launchctl list | grep cron
若输出中包含 com.vix.cron 且 PID 是正整数(如 32065 com.vix.cron),说明服务正在运行;若无任何输出,或仅显示 - com.vix.cron,说明服务未启用,需手动加载。
执行加载命令:sudo launchctl load -w /System/Library/LaunchDaemons/com.vix.cron.plist
注意:该plist文件在较新macOS版本中可能不存在。若提示“No such file”,跳过此步,直接进入下一步验证系统级crontab文件。
检查并创建系统级/etc/crontab(可选但推荐)
用户级crontab(crontab -e)无法触发某些需要root权限的操作,而系统级/etc/crontab支持指定执行用户,更稳妥。
先检查文件是否存在:ls -alF /etc/crontab
若提示“No such file or directory”,说明该文件尚未创建,需手动建立:
sudo touch /etc/crontab
然后赋予可读权限:sudo chmod 644 /etc/crontab
这一步不是必须的,但能避免后续因文件缺失导致任务静默失败——尤其当你在crontab中调用需要root权限的命令时。
为/usr/sbin/cron授予完全磁盘访问权限
这是Mac上crontab失效最常见、最关键的一环。Apple芯片(M1/M2/M3)和Intel Mac均需此操作,否则cron连你的桌面目录都进不去。
方法一:图形界面添加
① 打开「系统设置」→「隐私与安全性」→「完全磁盘访问权限」
② 点击左下角锁图标解锁,输入管理员密码
③ 点击「+」→ 按 Shift + Command + G → 输入路径:/usr/sbin → 回车
④ 在弹出窗口中找到并选中 cron 文件 → 点击「添加」
⑤ 确保列表中 cron 右侧复选框已被勾选
方法二:终端快速定位添加(适合熟悉路径者)
在终端中执行:open /usr/sbin,直接在访达中看到cron,拖入「完全磁盘访问权限」列表即可。
【重要】添加后必须彻底退出所有终端窗口(包括后台进程),再重新打开终端,权限才生效。
配置用户级定时任务并验证路径与重定向
很多任务失败不是因为cron没跑,而是脚本路径错、Python找不到、输出被丢弃。以下步骤确保每处都可靠。
第一步:编辑当前用户任务表:crontab -e
第二步:插入测试任务(每分钟记录时间,用于快速验证):
*/1 * * * * /bin/date >> /Users/$(whoami)/Desktop/cron_test.log 2>&1
注意:必须用绝对路径(/bin/date),不能写 date;重定向必须同时捕获标准输出和错误(2>&1),否则你看不到报错。
第三步:保存退出(vim中按Esc→输入:wq→回车;nano中按Ctrl+O→Enter→Ctrl+X)
第四步:立即验证是否写入:tail -n 1 /Users/$(whoami)/Desktop/cron_test.log
若1分钟后能看到时间戳,说明crontab已通;若仍为空,回到上一步检查cron权限是否真正生效、终端是否已重启、log路径是否有拼写错误。
第五步:替换为真实任务时,务必使用 which python3 获取解释器真实路径,并将脚本路径写成绝对路径,例如:
0 9 * * * /opt/homebrew/bin/python3 /Users/username/scripts/daily.py >> /Users/username/logs/daily.log 2>&1

















