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
:指定执行命令的shellPATH
:指定命令搜索路径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包)可以只在命令失败时输出错误信息