Cron表达式是一种用于配置定时任务的字符串,它由数字、字符和符号组成,用于指定任务在某个时间点或周期性地执行。其通常包含六个或七个字段,每个字段代表一个时间单位,如下表所示:
域 | 必须 | 取值范围 | 特殊字符 |
---|---|---|---|
秒 | 是 | [0, 59] | * , - / |
分钟 | 是 | [0, 59] | * , - / |
小时 | 是 | [0, 23] | * , - / |
日期 | 是 | [1, 31] | * , - / ? L W |
月份 | 是 | [1, 12]或[JAN, DEC] | * , - / |
星期 | 是 | [1, 7]或[MON, SUN]。若使用[1, 7]表达方式,1代表星期一,7代表星期日。 | * , - / ? L # |
年份 | 否 | 1970+ | - * / |
特殊字符
每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:
-
*:表示匹配该域的任意值。假如在分钟使用 *, 即表示每分钟都会触发事件。
-
?:只能用在日期和星期两个域。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用表示不管星期几都会触发,当然使用时将导致无法运行出结果。
-
-:表示范围。例如在分钟域中使用5-20,表示从5分到20分钟每分钟触发一次
-
/:表示起始时间开始触发,然后每隔固定时间触发一次。例如在分钟域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.
-
,:表示列出枚举值。例如:在分钟域使用5,20,则意味着在5和20分每分钟触发一次。L:表示最后,只能出现在日期和星期两个域。如果在星期域使用5L,意味着在最后的一个星期四触发。
-
W:表示有效工作日(周一到周五),只能出现在日期域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 星期使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。
-
LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
-
#:用于确定每个月第几个星期几,只能出现在星期域。例如在4#2,表示某月的第二个星期三。
常用表达式例子
以下是一些常用的cron表达式示例,以及它们的含义:
- 0 0 * * * - 每天每小时的开始(即每小时的0分0秒)。
- 0 15 10 * * * - 每天上午10点15分。
- 0 0 12 * * ? - 每天中午12点整。
- 0 15 10 ? * MON-FRI - 工作日的上午10点15分。
- 0 0 12 1 * ? - 每年1月1日中午12点整。
- 0 0 12 12 * ? - 每年12月12日中午12点整。
- 0 0 12 Jan * ? - 每年1月的每天中午12点整。
- 0 15 10 * * ? - 每月的每天上午10点15分。
- 0 0 12 * * ? - 每周的每天中午12点整(注意:有些系统不支持在星期字段中使用问号,这时可以用“*”代替)。
- 0 5 14,18 * * ? - 每天的下午2点和6点,当分钟为5时触发。
- 0 0/5 14 * * ? - 每天下午2点开始,每隔5分钟触发一次。
- 0 0/5 14,18 * * ? - 每天的下午2点到2:55和下午6点到6:55之间,每隔5分钟触发一次。
应用场景
cron定时任务在Unix和类Unix系统(包括Linux)中被广泛使用。cron允许系统管理员和用户安排作业(命令或脚本)在特定时间自动执行,无需人工干预。以下是cron的一些应用场景:
-
定期备份:Cron可以用于自动执行备份脚本,确保数据定期复制到安全位置。这对于防止数据丢失至关重要,因为可以按照小时、日、周或月来设置备份任务。
-
系统维护任务:系统管理员可以使用Cron来安排定期的系统维护任务,如更新软件包、清理临时文件、检查磁盘空间、优化数据库等。
-
定时报告:企业可以利用Cron定时生成业务报告、分析报告或其他类型的报告,并在特定时间发送给相关人员。
-
内容更新:对于网站和博客,Cron可以用来定时发布文章或更新内容,使得内容管理系统能够自动化地按计划发布材料。
-
监控服务:Cron作业可以用来监控服务器和服务的状态,如果检测到问题,可以自动触发警告或者恢复程序。
-
日志轮转:Cron可以用于自动执行日志轮转,将旧的日志文件归档并开始新的日志记录周期。