crontab命令

crontab 命令 #

crontab命令用于创建、显示和编辑用户的定时任务表(cron table)。它允许用户在指定的时间自动运行命令或脚本,是Linux系统中进行任务调度的重要工具。

语法 #

crontab [选项] [文件]

常用选项 #

选项 描述
-e 编辑当前用户的crontab文件
-l 显示当前用户的crontab文件内容
-r 删除当前用户的crontab文件
-i 在删除crontab文件前提示确认
-u 用户名 指定要操作的用户(需要root权限)

crontab文件格式 #

crontab文件中的每一行代表一个定时任务,格式如下:

分钟 小时 日期 月份 星期 命令

每个字段的取值范围:

字段 允许的值 允许的特殊字符
分钟 0-59 * , - /
小时 0-23 * , - /
日期 1-31 * , - / L W
月份 1-12 或 JAN-DEC * , - /
星期 0-7 或 SUN-SAT (0和7都表示星期日) * , - / L #
命令 要执行的命令或脚本

特殊字符说明 #

  • *:表示所有可能的值
  • ,:用于分隔多个值
  • -:表示一个范围
  • /:指定间隔频率
  • L:用在日期字段表示月份的最后一天,用在星期字段表示该月的最后一个星期几
  • W:用在日期字段表示最接近指定日期的工作日
  • #:用在星期字段表示第几个星期几
  • ?:用于日期和星期字段,表示不指定值(某些实现支持)

常见用法 #

1. 编辑当前用户的crontab #

crontab -e

2. 查看当前用户的crontab #

crontab -l

3. 删除当前用户的crontab #

crontab -r

4. 编辑指定用户的crontab(需要root权限) #

sudo crontab -u username -e

5. 从文件导入crontab #

crontab mycron.txt

定时任务示例 #

1. 每分钟执行一次 #

* * * * * /path/to/command

2. 每小时执行一次(在整点) #

0 * * * * /path/to/command

3. 每天凌晨2点执行 #

0 2 * * * /path/to/command

4. 每周一早上8点30分执行 #

30 8 * * 1 /path/to/command

5. 每月1日、15日和30日的午夜执行 #

0 0 1,15,30 * * /path/to/command

6. 工作日(周一至周五)每天下午5点执行 #

0 17 * * 1-5 /path/to/command

7. 每10分钟执行一次 #

*/10 * * * * /path/to/command

8. 每两小时执行一次 #

0 */2 * * * /path/to/command

9. 每天早上8点到下午5点之间,每小时执行一次 #

0 8-17 * * * /path/to/command

10. 每月最后一天的午夜执行 #

0 0 L * * /path/to/command

特殊时间格式 #

crontab还支持一些特殊的时间格式:

格式 描述
@reboot 系统启动时执行
@yearly@annually 每年执行一次(0 0 1 1 *)
@monthly 每月执行一次(0 0 1 * *)
@weekly 每周执行一次(0 0 * * 0)
@daily@midnight 每天执行一次(0 0 * * *)
@hourly 每小时执行一次(0 * * * *)

例如:

@daily /path/to/command

环境变量 #

crontab任务在执行时的环境变量与用户登录时不同。如果命令依赖于特定的环境变量,可以在crontab文件中设置:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[email protected]
HOME=/home/user

# 任务定义
0 * * * * /path/to/command

其中:

  • SHELL:指定执行命令的shell
  • PATH:指定命令搜索路径
  • MAILTO:指定发送任务输出的邮箱地址(空值表示不发送)
  • HOME:指定home目录

输出重定向 #

默认情况下,cron任务的输出会通过邮件发送给用户。可以通过重定向来保存或丢弃输出:

# 将标准输出和错误输出重定向到文件
0 * * * * /path/to/command > /path/to/logfile 2>&1

# 丢弃所有输出
0 * * * * /path/to/command > /dev/null 2>&1

实用示例 #

1. 每天备份数据库 #

0 2 * * * /usr/bin/mysqldump -u user -ppassword database > /backup/db_$(date +\%Y\%m\%d).sql

2. 每周日凌晨清理临时文件 #

0 0 * * 0 find /tmp -type f -atime +7 -delete

3. 工作日每小时检查网站可用性 #

0 * * * 1-5 curl -s http://example.com > /dev/null || mail -s "Website Down" [email protected]

4. 每5分钟监控系统负载并记录 #

*/5 * * * * uptime >> /var/log/system_load.log

5. 每月第一个星期一运行报告脚本 #

0 7 * * 1 [ $(date +\%d) -le 7 ] && /path/to/monthly_report.sh

6. 系统启动时自动启动应用 #

@reboot /path/to/start_application.sh

7. 每天在不同时间执行同一脚本 #

0 9,12,15,18 * * * /path/to/script.sh

系统crontab文件 #

除了用户crontab外,系统还有以下crontab相关文件和目录:

  • /etc/crontab:系统crontab文件
  • /etc/cron.d/:包含系统crontab片段的目录
  • /etc/cron.hourly/:每小时执行的脚本目录
  • /etc/cron.daily/:每天执行的脚本目录
  • /etc/cron.weekly/:每周执行的脚本目录
  • /etc/cron.monthly/:每月执行的脚本目录

系统crontab格式与用户crontab略有不同,多了一个用户字段:

分钟 小时 日期 月份 星期 用户 命令

常见问题排查 #

1. 任务未执行 #

可能的原因:

  • cron服务未运行(检查:systemctl status cron
  • 命令路径问题(使用绝对路径)
  • 权限问题(确保脚本有执行权限)
  • 环境变量问题(在crontab中设置必要的环境变量)

2. 查看cron日志 #

grep CRON /var/log/syslog

3. 测试cron任务 #

在设置cron任务前,先手动测试命令:

bash -c "your command here"

4. 常见错误 #

  • 使用%字符(需要转义为\%
  • 忘记设置执行权限(chmod +x script.sh
  • 使用相对路径(应使用绝对路径)
  • 依赖未设置的环境变量

与其他调度工具的比较 #

工具 优点 缺点 适用场景
crontab 简单、标准、广泛支持 最小间隔为1分钟、无依赖管理 定期任务、简单调度
systemd timers 更精细的控制、依赖管理、日志集成 配置较复杂 现代系统、需要依赖管理
at 一次性任务调度 不适合重复任务 延迟执行、一次性任务
anacron 适合非24/7运行的系统 精度较低 桌面系统、笔记本电脑

提示 #

  • 使用绝对路径指定命令和脚本
  • 在crontab中设置必要的环境变量
  • 重定向命令输出到文件或日志
  • 使用crontab -l > backup.cron备份crontab
  • 使用注释(以#开头)说明任务用途
  • 考虑使用flock防止任务重叠运行
  • 对于需要图形界面的任务,设置DISPLAY环境变量
  • 使用chronic(来自moreutils包)可以只在命令失败时输出错误信息