Crontab 定时作业
为了减少频繁的重复劳动,linux 运维人员最常用的办法是配置定时作业,让系统自动完成任务。Crontab 是 linux 下的定时作业工具,可以在无人工干预的情况下定时运行,自动完成配置好的作业任务。
1、构成
Crontab 由值守服务程序、配置文件、配置工具3部分构成:
系统服务:crond 值守进程,按照配置文件的内容,提供自动化作业执行服务,完成定时作业任务;
配置文件:文件 /etc/crontab 用于存放定时作业的任务配置信息,包括什么时间、频度,完成什么任务;
配置工具:crontab 可执行文件,用于配置定时作业的任务信息,配置好的内容保存在配置文件 /etc/crontab 中。语法:
crontab [ -u user ] { -l | -r | -e }
【参数说明】:-u username 指定任务操作(所属)用户,省略则表示当前用户的,影响下面3个操作的内容
-e 编辑任务配置表
-l 列出任务配置表
-r 删除任务配置表
为保证作业自动执行,首先需要检查crond系统服务是否有安装 ,并已自动启动值守中:
systemctl status crond.service
若 crond 服务未启动,可手工启动:
systemctl start crond.service
每次编辑更改作业配置后,需要重新载入配置,确保装载最新配置任务:
systemctl reload crond.service
或
systemctl restart crond.service
2、crontab 配置文件格式
* | * | * | * | * | command |
minute | hour | day | month | week | command |
分钟 | 小时 | 日 | 月 | 星期几 | 任务指令 |

minute: 表示分钟,可以是从 0 到 59 之间的任何整数;
hour: 表示小时,可以是从 0 到 23 之间的任何整数;
day: 表示日期,可以是从 1 到 31 之间的任何整数;
month: 表示月份,可以是从 1 到 12 之间的任何整数;
week: 表示星期几,可以是从 0 到 7 之间的任何整数,这里的 0 或 7 代表星期日;
command: 要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
Crontab 配置表达式中的每个域都支持一定数量的字符,每个字符有其特殊含义。
字符 | 含义 | 说明 |
* | 所有可能的值 | 在月域中,* 表示每个月;在星期域中,* 表示星期的每一天,如此类推。 |
, | 列出枚举值 | 在分钟域中,5,20 表示分别在 5 分钟 和 20 分钟触发一次,如此类推。 |
- | 范围 | 在分钟域中,5-20 表示从 5 分钟 到 20 分钟之间每隔一分钟触发一次,如此类推。 |
/ | 指定数值的增量 | 在分钟域中,0/15 表示从第 0 分钟开始,每 15 分钟。在分钟域中 3/20 表示从第 3 分钟开始,每 20 分钟,如此类推。 |
? | 不指定值,仅日期和星期域支持该字符 | 当日期或星期域其中之一被指定了值以后,为了避免冲突,需要将另一个域的值设为?。 |
L | 单词 Last 的首字母,表示最后一天,仅日期和星期域支持该字符 指定 L 字符时,避免指定列表或者范围,否则,会导致逻辑问题 | 在日期域中,L 表示某个月的最后一天。 在星期域中,L 表示一个星期的最后一天,也就是星期日(SUN)。 如果在L前有具体的内容,例如,在星期域中的 6L 表示这个月的最后一个星期六。 |
W | 除周末以外的有效工作日,在离指定日期的最近的有效工作日触发事件 | W 字符寻找最近有效工作日时不会跨过当前月份,连用字符 LW 时表示为指定月份的最后一个工作日。 在日期域中 5W,如果 5 日是星期六,则将在最近的工作日星期五,即 4 日触发。 如果 5 日是星期天,则将在最近的工作日星期一,即 6 日触发;如果 5 日在星期一到星期五中的一天,则就在 5 日触发。 |
# | 确定每个月第几个星期几,仅星期域支持该字符 | 在星期域中,4#2 表示某月的第二个星期四。 |
2.2、示例
每天凌晨 2 点定时执行 mongoDB 数据库备份脚本:
0 2 * * * /bin/sh /data/apps/cron-job/dump_mongo.sh > /tmp/dump_mongo.log
每周一、周四晚 20 时 30 分 执行 mongoDB 发奖脚本:30 20 * * 1,4 mongo /data/apps/cron-job/awards.js > /tmp/awards.log
每一分钟执行一次 command( cron 默认每 1 分钟扫描一次,因此全为*即可):
* * * * * command
每小时的第 5、15 分钟执行command:
5,15 * * * * command
每天上午 8-11 点的第 5、35 钟执行command:
5,35 8-11 * * * command
每隔 2 天的上午 8-11 点的第 1、31 分钟执行command:
1,31 8-11 */2 * * command
每个星期一的上午8点到11点的第15和第45分钟执行command:
15,45 8-11 * * 1 command
每晚的 21:30 重启smb:
30 21 * * * /etc/init.d/smb restart
每月 1、11、21 日的 4:45 重启smb:
45 4 1,11,21 * * /etc/init.d/smb restart
每周六、周日的5:30重启nginx
30 5 * * 6,0 nginx -s restart
每天 18:00 至 23:00 之间每隔 30 分钟执行一次 command:
0,30 18-23 * * * command