技术文章 > Linux > crontab定时作业 

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 
minutehourdaymonthweek command 
分钟小时星期几 任务指令 


minute:  表示分钟,可以是从 0 到 59 之间的任何整数;
hour: 表示小时,可以是从 0 到 23 之间的任何整数;
day: 表示日期,可以是从 1 到 31 之间的任何整数;
month: 表示月份,可以是从 1 到 12 之间的任何整数;
week: 表示星期几,可以是从 0 到 7 之间的任何整数,这里的 0 或 7 代表星期日;
command: 要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

2.1、字符含义
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


来源: 摘自https://blog.csdn.net/weixin_56175092/article/details/129316433https://blog.csdn.net/weixin_38036079/article/details/123388108 等,本站 行痴 整理,2023-08-21