每个操作系统都有它的自动定时启动程序的功能,Windows 有它的任务计划,而 Linux 对应的功能是 crontab 命令。
at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux 系统则是由 cron(crond) 这个系统服务来控制的。 Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另外, 由于使用者自己也可以设置计划任务,所以,Linux 系统也提供了使用者控制计划任务的命令:crontab 命令。
crond 简介
crond 是 linux 下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与 Windows 下的计划任务类似,当安装完操作系统后,默认会安装此服务工具,并且会自动启动 crond 进程。 crond 进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
Linux 下的任务调度分为两类,系统任务调度和用户任务调度。
- 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。
/etc/crontab文件是系统任务调度的配置文件。 - 用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的 crontab 文件都被保存在/var/spool/cron 目录中,其文件名与用户名一致。
系统管理员可以通过/etc/cron.deny 和/etc/cron.allow 这两个文件来禁止或允许用户拥有自己的 crontab 任务。
关于 crontab 的用途,在企业实际应用中非常广泛,常见的有定时数据备份、定时系统检测、定时数据收集、定时更新配置、定时生成报表等等。
Crontab 文件详解
/etc/crontab 文件内容包含包括以下内容
[root@localhost ~]# cat /etc/crontab
nstall crontabsSHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
[root@localhost ~]#
前四行是用来配置 crond 任务运行的环境变量
- 第一行 SHELL 变量指定了系统要使用哪个 shell,这里是 bash,
- 第二行 PATH 变量指定了系统执行命令的路径
- 第三行 MAILTO 变量指定了 crond 的任务执行信息将通过电子邮件发送给 root 用户,如果 MAILTO 变量的值为空,则表示不发送任务执行信息给用户
- 第四行的 HOME 变量指定了在执行命令或者脚本时使用的主目录。第六至九行表示的含义将在下个小节详细讲述。这里不在多说。用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 rontab 工具来定制自己的计划任务。所有用户定义的 crontab 文件都被保存在
/var/spool/cron目录中。其文件名与用户名一致。
Crontab 时间格式说明

| 分类 | 第 1 个 * | 第 2 个* | 第 3 个* | 第 4 个 * | 第 5 个 * | command |
| 名称 | minute | hour | day | month | week | command |
| 释义 | 分钟 | 小时 | 日期 | 月份 | 星期 | 要执行的命令 |
| 取值范围 | 0-59 | 0-23 | 1-31 | 1-12 或 jan,feb,mar,apr… | 0-7 或 sun,mon,tue,wed,thu,fri,sat 。 注意 0 和 7 均代表星期日 | 系统命令 编写的脚本 |
说明:
- 所有用户 crontab 文件存放的目录, 以用户名命名
- 用户所建立的 crontab 文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minutehourdaymonthweekcommandminute表示分钟,可以是从 0 到 59 之间的任何整数。hour表示小时,可以是从 0 到 23 之间的任何整数。day表示日期,可以是从 1 到 31 之间的任何整数。month表示月份,可以是从 1 到 12 之间的任何整数。week表示星期几,可以是从 0 到 7 之间的任何整数,这里的 0 或 7 代表星期日。command要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段的取值范围中,还可以使用以下特殊字符:
| 特殊字符 | 说明 |
| 星号 (*) | 表示所有可能的值,例如:minute 是 *,表示每分钟都执行命令 |
| 横杆 (-) | 用于表示一个范围,例如:第 5 个字段 (星期几) 中的 1-5 每个工作日,即星期一到星期五 |
| 正斜线 (/) | 用正斜线指定时间的间隔频率,例如:minute 是/15,表示 15 分钟都执行命令 |
| 逗号 (,) | 用于分隔项目,例如:第二个 (hour) 字段 (小时) 中的 2,6,8 在凌晨 2 点、早上 6 点和早上 8 点执行 |
| L | 仅允许用于 月份中的某天 或 星期几 字段,星期几 中的 2L 表示每个月的最后一个星期二 |
| 井号 (#) | 仅允许用于 星期几 字段,后面必须在 1 到 5 的范围内。例如,4#1 表示给定月份的 “第一个星期四” 。 |
| 问号 (?) | 可以代替 “*” 并允许用于月份和星期几。使用仅限于 cron 表达式中的 月份中的某天 或 星期几。 |
时间设置示例
| 时间设置 | 含义 |
* * * * * | 每分钟执行一次 |
0 * * * * | 每小时的第 0 分钟执行一次 |
0 0 * * * | 每天的午夜(0 点)执行一次 |
0 0 * * 0 | 每周日的午夜(0 点)执行一次 |
0 0 1 * * | 每个月的第一天午夜(0 点)执行一次 |
0 0 L * * | 每个月的最后一天午夜(0 点)执行一次 |
0 0 1 1 * | 每年的第一天午夜(0 点)执行一次 |
0 0 * * 3 | 每周三的午夜(0 点)执行一次 |
0 0 1,15 * * | 每个月的第 1 和第 15 天午夜(0 点)执行一次 |
0 0 * * FRI | 每周五的午夜(0 点)执行一次 |
0 0 * * 5 | 每周五的午夜(0 点)执行一次 |
0 8-17 * * * | 每天的上午 8 点到下午 5 点每小时执行一次 |
0 12 * * MON | 每周一的中午(12 点)执行一次 |
0 0 15 * * | 每个月的第 15 天午夜(0 点)执行一次 |
0 0 * * 3 | 每周三的午夜(0 点)执行一次 |
0 8-17 * * * | 每天的上午 8 点到下午 5 点每小时执行一次 |
0 0 * * 1-5 | 每个工作日的午夜(0 点)执行一次 |
0 0 1 * FRI | 每个月的第一个星期五午夜(0 点)执行一次 |
0 0 1,15 * * | 每个月的第 1 和第 15 天午夜(0 点)执行一次 |
0 0 15 1 * | 每年的 1 月 15 日午夜(0 点)执行一次 |
0 0 * * 7 | 每周日的午夜(0 点)执行一次 |
0 0 * * 5 | 每周五的午夜(0 点)执行一次 |
crontab 命令详解
命令语法格式:
crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
crontab -n [ HOSTNAME ]
crontab -c
常用选项说明:
crontab是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u USER是指用来设定某个用户的 crontab 任务,该参数仅有 root 权限才能设定。用于管理其他用户的定时任务。例如:crontab -u wanjia -l表示 root 用户查看wanjia用户的 crontab 任务。file是命令文件的名字, 表示将 file 做为 crontab 的任务列表文件并载入 crontab 。如果在命令行中没有指定这个文件,crontab 命令将接受标准输入 (键盘) 上键入的命令,并将它们载入 crontab 。-i在删除用户的 crontab 任务前询问用户是否确定删除提示。-e编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 任务,任务保存在/var/spool/cron目录下与用户名同名的文件中。-l显示某个用户的 crontab 文件内容,如果不指定用户,则表示列出显示当前用户的 crontab 定时任务。-r从/var/spool/cron目录中删除某个用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 任务。
其他选项说明:
-s在进行编辑/替换之前,将当前的 SELinux 安全上下文字符串作为 MLS_LEVEL 附加到 crontab 文件-n [HOSTNAME]此选项只有当 cron(8) 使用-c 选项启动以支持集群环境时才使用,用于指定集群中哪个主机执行定时 crontab 文件中的定时任务。如果省略了主机名,则使用 gethostname(2) 返回的本地主机名-c此选项只有当 cron(8) 使用-c 选项启动以支持集群环境时才使用,用于查询集群中当前哪个主机执行定时 crontab 文件中的定时任务
使用实例
使用 root 管理员登录 SSH,输入命令 nano /etc/crontab 编辑 crontab 文件,根据格式要求输入并保存
- 保存:使用 Ctrl + O 来保存所做的修改、退出编辑器:使用 Ctrl + X 退出编辑器
| 含义说明 | |
| * * * * * command | 每 1 分钟,执行一次 command 命令 |
| 3,15 * * * * command | 每小时的第 3 和第 15 分钟,执行一次 command 命令 |
| 3,15 8-11 * * * command | 8 点到 11 点的第 3 和第 15 分钟,执行一次 command 命令 |
| 3,15 8-11 */2 * * command | 每隔两天的 8 点到 11 点的第 3 和第 15 分钟,执行一次 command 命令 |
| 3,15 8-11 * * 1 command | 每星期一的 8 点到 11 点的第 3 和第 15 分钟,执行一次 command 命令 |
| 0 2 * * * /root/test.s | 每天 2 点,执行 root 目录下的 test.sh 脚本。 |
| 0 23 * * 6 /etc/init.d/smb restart | 每星期六的 23 点,执行重启 smb 命令 |
| * */1 * * * /etc/init.d/smb restart | 每一小时,执行重启 smb 命令 |
| 30 21 * * * /etc/init.d/smb restart | 每晚的 21:30,执行重启 smb 命令 |
| 0 4 2 jan * /etc/init.d/smb restart | 1 月 2 号的 4 点,执行重启 smb 命令 |
| 10 1 * * 6,0 /etc/init.d/smb restart | 每周六、周日的 1 点 10,执行重启 smb 命令 |
| * 23-7/1 * * * /etc/init.d/smb restart | 23 点到早上 7 点之间,每隔一小时,执行重启 smb 命令 |
| 0,30 18-23 * * * /etc/init.d/smb restart | 每天 18 至 23 之间每隔 30 分钟,执行重启 smb 命令 |
| 45 4 1,10,22 * * /etc/init.d/smb restart | 每月 1 、 10 、 22 日的 4 点 45,执行重启 smb 命令 |
| 0 11 4 * mon-wed /etc/init.d/smb restart | 每月 4 号与每周一到周三的 11 点,执行重启 smb 命令 |
| 5 23 * * * root /home/mysql_data/mysql_databak.sh | 每天 23 点 05 分,执行/home/mysql_data/mysql_databak.sh 的文件命令 |
| 01 * * * * root run-parts /etc/cron.hourly | 每小时执行/etc/cron.hourly 目录内的脚本命令 |
使用者也可以将所有的设定先存放在文件中,用 crontab file 的方式来设定执行时间。
crontab 用法其实很容易掌握,懂得使用 crontab,对网站和服务器维护起到很大的帮助,比如定时备份,定时优化服务器等。
参考资料:
- https://www.nasge.com/archives/45.html
- https://www.amjun.com/397.html
- Linux crontab 命令,https://www.runoob.com/linux/linux-comm-crontab.html
- crontab(1) command_cron table,https://dablelv.blog.csdn.net/article/details/103264609
- 计划任务之 crontab ,https://zhuanlan.zhihu.com/p/594333950