Linux 定时任务 cron 完全指南:写法、日志与常见坑
服务器上很多事要定时做:每天备份数据库、每周清理日志、每小时拉一次数据。Linux 里干这活的是 cron。配置文件写好,系统到点自动执行,比人肉记得住。
crontab 的五段格式
编辑当前用户的定时任务:
crontab -e每一行是一条任务,五个字段依次是:
分 时 日 月 星期 命令
*/5 * * * * /usr/local/bin/backup.sh五个字段的含义:
| 字段 | 范围 | 示例 |
|---|---|---|
| 分 | 0-59 | */5 = 每 5 分钟 |
| 时 | 0-23 | 2 = 凌晨 2 点 |
| 日 | 1-31 | 1 = 每月 1 号 |
| 月 | 1-12 | 6 = 6 月 |
| 星期 | 0-7(0 和 7 都是周日) | 1-5 = 周一到周五 |
五个字段都写 * 表示"每个",*/N 表示"每隔 N 个单位"。
几个常用写法
# 每天凌晨 2 点备份数据库
0 2 * * * /root/backup_mysql.sh
# 每周一早上 9 点发周报
0 9 * * 1 /home/user/weekly.sh
# 每 10 分钟检查一次服务
*/10 * * * * /usr/local/bin/check_svc.sh
# 每月 1 号 0 点清理旧日志
0 0 1 * * find /var/log -name "*.log" -mtime +30 -delete任务不执行,从哪查起
- 先确认服务在跑:
systemctl status cron(Debian/Ubuntu)或systemctl status crond(CentOS); - 看任务有没有被记录:
crontab -l列出当前用户所有任务; - 看执行日志:
grep CRON /var/log/syslog(Debian)或tail /var/log/cron(CentOS); - 把命令先手动跑一遍:很多"不执行"其实是脚本本身报错,比如路径写错、脚本没有执行权限。
最容易踩的坑
cron 执行环境和你手动登录时不一样:它不加载你的用户环境变量,PATH 也精简。脚本里用到命令最好写绝对路径,或者在脚本开头先定义 PATH。另一个常见问题是脚本文件要可执行:
chmod +x /path/to/script.sh还有时区:服务器默认是 UTC,和北京时间差 8 小时。想要任务按北京时间跑,先执行 timedatectl set-timezone Asia/Shanghai 再写任务,否则"每天凌晨 2 点"实际是北京时间的上午 10 点。
调试思路就一条:先手动跑通脚本,再看 cron 日志。脚本能手动执行成功,问题基本就在环境变量或权限上。