Linux 定时任务 cron 完全指南:写法、日志与常见坑

Linux 运维 2026-08-10 5 浏览

服务器上很多事要定时做:每天备份数据库、每周清理日志、每小时拉一次数据。Linux 里干这活的是 cron。配置文件写好,系统到点自动执行,比人肉记得住。

crontab 的五段格式

编辑当前用户的定时任务:

crontab -e

每一行是一条任务,五个字段依次是:

分 时 日 月 星期   命令
*/5 * * * *       /usr/local/bin/backup.sh

五个字段的含义:

字段范围示例
0-59*/5 = 每 5 分钟
0-232 = 凌晨 2 点
1-311 = 每月 1 号
1-126 = 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 日志。脚本能手动执行成功,问题基本就在环境变量或权限上。