crontab 是 Linux 最常用的定时任务工具,很多任务"写了却不执行"往往不是 cron 坏了,而是写法或环境踩了坑。本文把基本写法、常用命令、推荐写法和常见失效原因讲清楚,照着排查,多数问题都能快速定位。
一、crontab 基本写法
crontab 的一行任务由 5 个时间字段加命令组成,依次是:分 时 日 月 周。
举例:
* * * * * 表示每分钟执行一次;
0 2 * * * 表示每天凌晨 2 点执行;
*/5 * * * * 表示每 5 分钟执行一次;
0 9 * * 1 表示每周一上午 9 点执行;
0 0 1 * * 表示每月 1 号 0 点执行。
特殊符号含义:* 表示任意值;, 表示列表;- 表示范围;/ 表示步长。
二、常用操作命令
crontab -e:编辑当前用户的任务;
crontab -l:查看当前用户的任务;
crontab -r:删除当前用户的任务,比较危险,执行前先备份:crontab -l > ~/crontab.bak;
systemctl status cron 或 systemctl status crond:查看定时任务服务状态,不同发行版的服务名不同。
三、推荐写法示例
推荐用绝对路径,并把输出重定向到日志文件,便于排查:
0 2 * * * /usr/bin/python3 /home/user/backup.py >> /home/user/backup.log 2>&1
*/10 * * * * /bin/bash /home/user/check.sh >> /home/user/check.log 2>&1
这样做的好处很直接:命令不会因为 PATH 不同而找不到,脚本出错时也能在日志文件里看到,而不是悄悄失败。
四、常见失效原因与对策
-
环境变量不同:cron 的环境很精简,PATH 可能不含 /usr/local/bin。命令请写绝对路径,或在 crontab 开头声明 PATH。
-
相对路径失效:脚本里不要依赖当前目录,文件路径一律写绝对路径。
-
权限问题:脚本没有可执行权限时先执行 chmod +x;还要确认 cron 用户有权读写目标文件。
-
% 需要转义:在 crontab 里 % 表示换行,命令中用到 %(如 date +%F)要写成 \%。
-
服务没启动或时区不对:先确认 cron/crond 在运行,再用 date 核对系统时区和时间。
-
编辑后没保存或写错用户:确认 crontab -l 能看到新任务;系统级任务注意 /etc/crontab 还有用户字段。
-
静默失败无日志:务必加 >> 日志 2>&1,否则出错也看不到。
五、排查清单
先用 crontab -l 确认任务存在,再看系统日志(journalctl -u cron 或 journalctl -u crond,也可看 /var/log/cron),再看自己重定向的日志文件,最后手动执行一次脚本命令验证。
结尾:写 crontab 记住三点------绝对路径、重定向日志、先手动跑通。