Post

Cron 表达式和 crontab 命令

Cron 表达式和 crontab 命令

CRON表达式是一个用于设置计划任务的字符串,其由几个字段组成,每个字段代表任务在相应时间、日期或时间间隔执行的规则。CRON表达式最初是在类Unix操作系统中使用的,而现在它已经被广泛地应用于各种操作系统和编程语言中。

一个标准的CRON表达式由五个至六个部分组成,分别为:秒(second)、分钟(minute)、小时(hour)、日(day-of-month)、月(month)和年(year)。其中,年并不是必需的部分,只有在需要特定年份的任务时才使用。

1、Cron表达式的结构

CRON表达式基本格式为:* * * * *,每个星号代表一个字段的取值范围。CRON表达式中的每个字段都可以使用以下符号和数字设置特定的任务执行时间:

  • 数字:表示对应的时间点值(如1表示1点)
  • 星号(*):表示该字段的所有可能值,如分钟字段中的星号表示每分钟的任何时间点
  • 逗号(,):用于分割字段中的多个取值,如“2,5,10”表示取值为2、5、10的时间点
  • 连接符(-):用于指定时间段,如“1-5”表示取值范围为1到5的所有时间点
  • 斜杠(/):用于指定时间步长,如“*/10”表示每隔10个时间点执行一次任务
特殊字符含义
*所有可能值
/步长
,列举多个值,表示具体时间点
-表示范围,如1-5表示取值范围为1到5的所有时间点
?日和星期任选其一
Llast,表示某个月最后一天或某个星期的最后一天
W工作日(周一至周五)
#表示某个月的第几个星期几,如4#2表示某月的第二个星期四

下面是CRON表达式中每个字段的取值范围和示例:

  • 秒(second):0~59
  • 分钟(minute):0~59
  • 小时(hour):0~23
  • 日(day):1~31
  • 月(month):1~12或JAN-DEC
  • 年(year):可选,1970~2099或者空

举个例子,一个CRON表达式为 0 0/5 * * * ? 表示每隔5分钟执行一次任务。这个表达式可以被解读为“在每小时的0分0秒开始,每隔5分钟运行一次”。另一个示例是 0 0 0 ? * MON-FRI,它表示每个工作日的午夜零点执行任务。

除了上述基本的取值设置方式外,还有一些常用的高级特性,如:

  • @yearly:等同于0 0 0 1 1 *,表示每年的1月1日零点执行任务。
  • @monthly:等同于0 0 0 1 * *,表示每月的1日零点执行任务。
  • @weekly:等同于0 0 0 * * 0,表示每周日午夜执行任务。
  • @daily:等同于0 0 0 * * *,表示每天午夜执行任务。
  • @hourly:等同于0 0 * * * *,表示每小时的0分0秒执行任务。

CRON表达式广泛应用于各种计划任务场景,如定时备份、自动化测试、定时数据清理、定时发送邮件等。在使用CRON表达式时,需要注意一些问题:

  • CRON表达式中的时间是基于服务器所在时区而非本地时区进行计算的。
  • CRON表达式并不支持秒级别的时间设置,最小单位为分钟。
  • 在设置CRON表达式时,需要考虑任务运行时间的长短以及系统资源的可用性,以免造成系统瓶颈或任务重叠等问题。

2、使用示例

下面是CRON表达式的结构和一些示例:

  1. 秒(Second):0~59
  2. 分钟(Minute):0~59
  3. 小时(Hour):0~23
  4. 日(Day):1~31
  5. 月(Month):1~12或JAN-DEC
  6. 星期(Weekday):0~6或SUN-SAT(0代表星期天)

每个字段可以使用以下符号和数字来设置,以下是一些示例:

  • 0 0 * * * :每天凌晨零点执行任务
  • 0 12 * * ? :每天中午12点执行任务
  • 30 8 * * 1-5 :周一至周五早上8:30执行任务
  • 0 23 ? * FRI :每周五晚上11点执行任务
  • 0/5 * * * * ? :每5秒执行任务
  • 0 0 1 * * :每个月的第一天凌晨执行任务
  • 0 0 8 1,15 * :每月1日和15日早上8点执行任务
  • 0 0 2 1 * ? * 表示在每月的1日的凌晨2点调整任务
  • 0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业
  • 0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作
  • 0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
  • 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
  • 0 0 12 ? * WED 表示每个星期三中午12点
  • 0 0 12 * * ? 每天中午12点触发
  • 0 15 10 ? * * 每天上午10:15触发
  • 0 15 10 * * ? 每天上午10:15触发
  • 0 15 10 * * ? * 每天上午10:15触发
  • 0 15 10 * * ? 2005 2005年的每天上午10:15触发
  • 0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
  • 0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
  • 0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
  • 0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
  • 0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
  • 0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
  • 0 15 10 15 * ? 每月15日上午10:15触发
  • 0 15 10 L * ? 每月最后一日的上午10:15触发
  • 0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
  • 0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
  • 0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发

希望这些示例能够帮助您更好地了解CRON表达式的使用方法。

3、crontab 定时任务

在 Linux 系统的实际使用中,可能经常碰到让系统在某个特定时间执行某些任务的情况,比如定时采集服务器的状态信息、负载情况;定时执行某些任务/脚本来对远端进行数据采集等。

生产任务管理常见的使用场景包括:

  • 定时任务:如定时发送邮件、备份数据、执行清理操作等;
  • 批处理任务:如处理大量数据、生成报表、更新缓存等;
  • 自动化测试:如定时运行测试用例、检查程序错误等。

crond 服务

Linux下的任务调度分为两类,系统任务调度和用户任务调度。Linux 系统任务是由 cron(crond) 这个系统服务来控制的,这个系统服务是默认启动的。用户自己设置则需要使用 crontab 命令。

(1) 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。

在/etc/crontab文件,这个就是系统任务调度的配置文件。

(2) 用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。

用户可以使用 crontab 工具来定制自己的计划任务。

crontab:定时任务的守护进程,精确到分,设计秒的我们一般写脚本 –>相当于闹钟

日志文件: ls -alh /var/log/cron*

编辑文件: vim /etc/crontab

进程:ps -efgrep crond ==> /etc/init.d/crond restart

作用:定时备份,实时备份

  • cat /etc/crotab 查看配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
➜  ~ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
# You can also override PATH, but by default, newer versions inherit it from the environment
#PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# 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
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
➜  ~

前四行,可以配置 crond 任务运行的环境变量

  1. SHELL 指定系统使用哪个SHELL,比如用 bash;
  2. PATH 指定系统执行命令的路径 PATH;
  3. MAILTO 指定 crond 的任务执行信息将通过电子邮件发送给哪个用户,如果为空,则不发送任务执行信息给用户;
  4. HOME 执行在执行命令或者脚本时使用的主目录。

在crontab 文件都被保存在/var/spool/cron目录中。其文件名与用户名一致

1.系统定时任务:例如清理系统日志,清理系统缓存 –>不过多的关注

查询系统定时处理任务的路径:

路径1:

cd /etc/logrotate.d/ –>可以写定时任务

less syslog

路径2:

cat /etc/crontab –>不推荐使用,但是可以看格式

路径3:

ls /etc/grep cron*

anacrontab

cron.d –>同路径2 ,可以写定时任务

cron.daily

cron.deny –>控制普通用户使用定时任务crontab

cron.hourly

cron.monthly

crontab

cron.weekly

2.用户的定时任务 –>关注重点

crontab 命令

1
2
crontab [ -u user ] file
crontab [ -u user ] { -e | -l | -r }
This post is licensed under CC BY 4.0 by the author.