0

Linux定时任务crontab详解:从语法规则到实战案例的完整指南

2026.05.22 | youres | 11次围观

什么是crontab

crontab是Linux系统自带的定时任务调度工具,它可以让系统按照预设的时间周期自动执行脚本或命令。无论是日志轮转、数据备份、证书续期还是监控报警,crontab都是服务器运维中最基础也最常用的自动化手段。

crontab的名字来源于cron(时间守护进程)+ table(表格),本质上就是一张告诉系统"什么时间做什么事"的规则表。

crontab基础语法

每条crontab规则由6个字段组成,用空格分隔:

*    *    *    *    *    command
分   时   日   月   周   要执行的命令

各字段取值范围:

  • :0-59
  • :0-23
  • :1-31
  • :1-12
  • :0-7(0和7都代表周日)

特殊符号详解

crontab支持4个特殊符号,灵活组合可以覆盖几乎所有调度需求:

  • *(星号) — 每个取值都匹配,相当于"每"
  • ,(逗号) — 列举多个离散值,如 1,15 表示1号和15号
  • -(连字符) — 连续范围,如 1-5 表示1到5
  • /(斜杠) — 步长间隔,如 */5 表示每隔5个单位

组合示例:0 8-18/2 * * 1-5 表示工作日8点到18点每隔2小时执行。

常用crontab命令

crontab -e          # 编辑当前用户的定时任务
crontab -l          # 列出当前用户的所有定时任务
crontab -r          # 删除当前用户的所有定时任务
crontab -u root -l  # 查看指定用户的定时任务(需root权限)

编辑时系统会调用默认编辑器(通常是vi或nano),保存后cron会自动加载新规则,无需重启服务。

10个实战案例

以下是从简单到进阶的10个常见场景:

  1. 每分钟执行* * * * * /path/to/script.sh
  2. 每天凌晨3点备份0 3 * * * /root/backup.sh
  3. 每小时执行0 * * * * /path/to/check.sh
  4. 每5分钟检查服务*/5 * * * * /usr/bin/check_service.sh
  5. 工作日早9点执行0 9 * * 1-5 /path/to/work.sh
  6. 每月1号凌晨2点0 2 1 * * /root/monthly.sh
  7. 每周日凌晨4点清理0 4 * * 0 /root/cleanup.sh
  8. 每天6:30和18:3030 6,18 * * * /path/to/sync.sh
  9. 每季度第一天0 0 1 1,4,7,10 * /root/quarterly.sh
  10. 每10秒执行(变通写法):需要配合sleep,写3条规则间隔20秒

环境变量陷阱

这是很多人踩过的坑:crontab执行环境和你登录的Shell环境不一样。cron会提供一个精简的环境,PATH通常只有/usr/bin:/bin,很多你自己安装的命令可能找不到。

解决方案

  • 在脚本中使用命令的完整路径,如 /usr/local/bin/python3
  • 在crontab文件顶部手动设置PATH:PATH=/usr/local/bin:/usr/bin:/bin
  • 在脚本开头 source ~/.bashrc 或 source /etc/profile

另一个常见问题:crontab中的%有特殊含义(换行符),日期格式化时必须转义:\%Y-\%m-\%d,否则命令会报错。

日志与调试

crontab任务不执行是最让人头疼的问题,以下是排查步骤:

  1. 查看cron日志:grep CRON /var/log/syslog(Ubuntu)或 grep CROND /var/log/cron(CentOS)
  2. 重定向输出:在命令后添加重定向到日志文件来捕获错误信息
  3. 检查cron服务systemctl status cronsystemctl status crond
  4. 验证脚本权限chmod +x /path/to/script.sh
  5. 检查换行符:确保脚本不是Windows格式的CRLF换行,用 dos2unix 转换

特殊时间宏

部分cron实现支持这些快捷写法:

  • @reboot — 系统启动时执行一次
  • @yearly@annually — 每年1月1日0点
  • @monthly — 每月1日0点
  • @weekly — 每周日0点
  • @daily@midnight — 每天0点
  • @hourly — 每小时0分

其中 @reboot 特别实用,常用于启动某些守护进程或初始化脚本。

安全注意事项

  • 允许使用crontab的用户由 /etc/cron.allow 和 /etc/cron.deny 控制,优先级:allow 大于 deny
  • 不要在crontab命令中硬编码密码,改用密钥文件或环境变量
  • 定时清理过期的crontab任务,避免无人维护的"僵尸任务"消耗资源
  • 生产环境建议用 /etc/cron.d/ 目录管理任务,每个任务一个文件,方便版本控制

/etc/cron.d vs crontab -e

两者的核心区别:

  • crontab -e:用户级别,每个用户一份,适合个人任务
  • /etc/cron.d/:系统级别,可以指定执行用户,适合运维团队协作管理
  • /etc/crontab:系统主crontab文件,格式多一个"用户"字段,不推荐直接改

推荐做法:运维脚本统一放 /etc/cron.d/,个人开发任务用 crontab -e。

常见问题FAQ

Q:crontab修改后需要重启cron服务吗?
A:不需要。cron每分钟会自动检查crontab文件的变化。

Q:为什么我的脚本手动执行正常,crontab里就不行?
A:90%是环境变量问题,参照上面"环境变量陷阱"一节排查。

Q:crontab最小时间间隔是多少?
A:最小1分钟。如果需要秒级调度,可以用systemd timer或者shell循环+sleep。

Q:如何实现"每隔90分钟"执行?
A:crontab做不到非整除间隔,需要换思路:写一个每分钟执行的脚本,内部判断距上次执行是否过了90分钟。

相关文章

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论