必须用 crontab -e 配合 sublime 编辑,设 editor="subl -w" 并禁用 crontab 插件校验;顶部声明 shell 和 path,命令用绝对路径;所有任务须重定向日志验证执行。

crontab -e 必须调用 Sublime,不能直接编辑文件
Sublime 里新建一个 crontab 文件保存到桌面,再手动复制进 /var/spool/cron/ —— 这种做法完全无效。cron 守护进程只认 crontab -e 写入的版本,它会做权限校验、格式检查、原子写入,跳过这步等于白干。
正确流程是:先设好 EDITOR 环境变量,再运行 crontab -e:
- macOS:
export EDITOR="subl -w"(-w不可省,否则 Sublime 启动即返,crontab 当你没编辑) - Linux:
export EDITOR="/opt/sublime_text/subl -w"(路径按实际安装位置调整) - 临时生效就写在当前终端;永久生效加到
~/.zshrc或~/.bashrc
运行 crontab -e 后,如果看到 Sublime 窗口弹出并加载了已有任务,说明成功;如果还是进 vim/nano,说明 EDITOR 没生效或被其他配置覆盖。
CronTab 插件必须关掉语法校验
装完 CronTab 插件后,0 9 * * 1-5 这类合法表达式仍被标红?那是插件默认开启 "validate_cron": true,它把很多标准写法当错误处理。
解决方法很简单:
- 菜单 → Preferences → Package Settings → CronTab → Settings
- 把
"validate_cron": true改成"validate_cron": false - 保存后重启 Sublime(或重载语法)
这个插件不检查命令是否存在、不转义 %、也不验证路径,高亮只是视觉辅助,别信它的红波浪线。
PATH 和 SHELL 必须显式声明,不能依赖终端环境
你在终端里能跑通 python3 /home/user/script.py,但放进 crontab 就报 command not found —— 因为 cron 默认 PATH=/usr/bin:/bin,不含 /usr/local/bin 或用户自定义 bin 目录。
务必在 crontab 文件最顶部加两行:
SHELL=/bin/bash PATH=/usr/local/bin:/usr/bin:/bin:/home/user/.local/bin
然后所有命令都用绝对路径:
- 错:
python3 script.py、./backup.sh - 对:
/usr/bin/python3 /home/user/script.py、/home/user/backup.sh
相对路径(如 log.txt)默认基于用户 home 目录,不是 Sublime 当前打开的文件夹,这点极易混淆。
调试必须靠日志重定向,不能靠“感觉”
写完 * * * * * /home/user/check.sh 就以为每分钟都在跑?没日志等于没执行。
第一件事:先用最简命令验证通路:
* * * * * /bin/date >> /tmp/cron-test.log 2>&1
等 2 分钟后 tail -f /tmp/cron-test.log,看到时间戳才说明 cron 服务、权限、基础路径全 OK。再换真实脚本。
真实任务也必须加重定向:
0 2 * * * /home/user/backup.sh >> /home/user/backup.log 2>&1- 别漏
2>&1,否则错误信息全丢进黑洞 - 日志路径也得是绝对路径,且确保目录存在、有写权限
Mac 用户还要额外确认「终端」有「完全磁盘访问」权限,否则连 /tmp/ 都写不进。











