1. 什么是 Crontab?
crontab(代表 “cron table”)是一个用于安装、卸载、列出和编辑cron job的命令。而 cron 是 Linux 系统中最常用的任务调度程序,它可以在指定的时间、日期或间隔自动地执行预定的命令或脚本(这些任务就称为 cron job)。
简单来说,crontab 就是用来设置和管理定时任务的工具。
2. 为什么需要 Crontab?
想象一下这些场景:
- 每天凌晨 2 点自动备份数据库。
- 每周一早上 5 点清理服务器上的临时文件。
- 每隔 5 分钟检查一次某个进程是否在运行,如果崩溃则重启它。
- 每月 1 号给你发送一封系统状态报告的邮件。
你不可能手动、准时地去做这些重复性的工作。Crontab 就是为了实现自动化而生的,它是系统管理和开发运维的利器。
3. Crontab 的基本语法
一个 crontab 条目(即一个定时任务)由两部分组成:
- 时间调度字段:定义任务执行的时间。
- 要执行的命令:到时间后具体做什么。
其格式如下:
* * * * * command-to-be-executed
- - - - -
| | | | |
| | | | +----- Day of the week (0 - 7) (Sunday is 0 or 7)
| | | +------- Month (1 - 12)
| | +--------- Day of the month (1 - 31)
| +----------- Hour (0 - 23)
+------------- Minute (0 - 59)
时间字段说明:
| 字段 | 允许的值 | 特殊字符 |
|---|---|---|
| 分钟 (Minute) | 0-59 | * , - / |
| 小时 (Hour) | 0-23 | * , - / |
| 日 (Day) | 1-31 | * , - ? / |
| 月 (Month) | 1-12 或 JAN-DEC | * , - / |
| 星期 (Week) | 0-7 或 SUN-SAT (0和7都代表周日) | * , - ? / |
特殊字符说明:
*(星号):代表“每”。例如,在分钟字段的*表示“每分钟”。,(逗号):指定多个值。例如1,3,5在小时字段表示“第1、3、5小时”。-(连字符):指定一个范围。例如10-12在月份字段表示“10月、11月、12月”。/(斜杠):指定间隔频率。例如*/5在分钟字段表示“每5分钟”。?(问号):通常用在“日”和“星期”字段,表示“不指定具体值”,与*类似,但更常用于避免冲突。
4. 常用 Crontab 命令
crontab 命令本身是用来管理任务列表的:
crontab -e- 编辑当前用户的 cron 任务表。这会打开一个文本编辑器(如 vim 或 nano),你可以在里面添加、修改或删除任务条目。这是最常用的命令。
crontab -l- 列出当前用户的所有 cron 任务。
crontab -r- 移除当前用户的所有 cron 任务。(慎用!这会删除所有任务,没有确认!)
crontab -u username -e(需要 root 权限)- 编辑其他用户(如
username)的 cron 任务。只有 root 用户可以这样做。
- 编辑其他用户(如
5. 实例详解
假设你的用户是 ubuntu。
-
每天凌晨 2:30 执行备份脚本
30 2 * * * /home/ubuntu/scripts/backup.sh30 2 * * *:每天 2:30 AM。command:执行/home/ubuntu/scripts/backup.sh这个脚本。
-
每周一和周五下午 5:00 发送邮件
0 17 * * 1,5 /usr/bin/python3 /home/ubuntu/send_report.py0 17 * * 1,5:每周一和周五(1和5)的下午 5:00(17点)。command:用 Python 3 执行send_report.py脚本。注意:对于脚本,最好使用绝对路径。
-
每 10 分钟检查一次磁盘空间
*/10 * * * * /home/ubuntu/scripts/check_disk.sh*/10 * * * *:每 10 分钟(0,10,20,30,40,50分)。
-
每月 1 号中午 12:00 清理日志
0 12 1 * * /bin/rm -f /tmp/*.log0 12 1 * *:每月 1 号中午 12:00。command:强制删除/tmp/目录下所有.log文件。
-
每年 1 月 1 日 00:00 执行任务(新年快乐!)
0 0 1 1 * /home/ubuntu/scripts/happy_new_year.sh0 0 1 1 *:1月1日 00:00。
6. 环境变量和输出处理
-
环境问题:cron 执行任务的环境与你的用户 shell 环境不同,它非常精简。因此,如果你的脚本依赖于某些环境变量(如
PATH),最好在脚本中使用绝对路径,或者在 crontab 文件的最顶部自己定义变量。SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin MAILTO=your_email@example.com 30 2 * * * /home/ubuntu/scripts/backup.sh > /dev/null 2>&1MAILTO:任务如果有输出(标准输出或错误输出),cron 会默认将这些输出以邮件形式发送给该用户。你可以在这里指定邮箱地址。
-
输出重定向:
> /dev/null 2>&1:这是一个常见的用法,表示将标准输出(1) 和错误输出(2) 都重定向到“黑洞”/dev/null,即丢弃所有输出,不发送邮件。>> /path/to/logfile 2>&1:将标准输出和错误输出都追加到指定的日志文件中,便于调试和查看记录。
7. 注意事项和最佳实践
-
使用绝对路径:在命令和脚本中,尽量使用绝对路径,因为 cron 的
PATH环境变量可能与你的 shell 不同。- 错误示例:
myscript.sh(cron 可能找不到这个命令) - 正确示例:
/home/me/scripts/myscript.sh
- 错误示例:
-
脚本要有执行权限:确保你打算通过 cron 运行的脚本具有可执行权限 (
chmod +x script.sh)。 -
手动测试命令:在将命令放入 crontab 之前,务必先在终端中手动运行一次,确保它能独立正常工作。
-
查看日志以调试:如果 cron 任务没有按预期执行,第一件事就是去查看系统日志。在 Ubuntu/Debian 上,cron 的日志通常在
/var/log/syslog中,可以使用grep过滤:grep CRON /var/log/syslog这会显示所有与 cron 相关的日志记录,对于排查问题非常有帮助。
总结
| 命令/操作 | 功能描述 |
|---|---|
crontab -e | 编辑当前用户的定时任务列表 |
crontab -l | 查看当前用户的定时任务列表 |
crontab -r | 删除当前用户的所有定时任务 |
* * * * * command | 任务条目的基本格式 |
> /dev/null 2>&1 | 丢弃任务执行的所有输出,避免发邮件 |
查看 /var/log/syslog | 调试任务失败的首要途径 |
crontab 是 Linux 自动化运维的核心工具之一,熟练掌握它能极大地提升你的工作效率和系统的自动化程度。
Linux Crontab定时任务详解

108万+

被折叠的 条评论
为什么被折叠?



