Cron表达式基本结构
f1 f2 f3 f4 f5 program
* * * * * <command-to-execute>
│ │ │ │ │
│ │ │ │ └─ 星期几 (0 - 7) (0 或 7 表示星期日)
│ │ │ └──── 月份 (1 - 12)
│ │ └────── 日 (1 - 31)
│ └──────── 时 (0 - 23)
└────────── 分 (0 - 59)
*
表示任何值,f1
为*
时,表示每分钟都执行,f2
为*
时,表示每小时都要执行,f5
为*
表示每星期都要执行。-
表示时间范围,f1
为a-b
,表示在每分钟的第a
到第b
分钟这段时间内,每一分钟都会执行任务,f2
为a-b
,表示在每小时的第a
到第b
小时这段时间内,每一小时都会执行任务。/
表示间隔,例如*/n
,以f1
为例,表示每n
分钟要执行一次,适用于分钟,小时,每日,每月,而对于星期来说,0/n
表示每隔第n
个星期天(星期天,0)执行一次,1/3
表示从星期一(星期天为0,星期一为1)开始,每隔 3 天执行一次任务。当
f1
为a, b, c,...
时表示第a, b, c,...
分钟要执行,f2 为a, b, c,...
时表示第a, b, c...
个小时要执行。?
表示不指定值,仅在日和星期字段中使用。L
:表示最后一个。W
:表示最近工作日。#
:表示该月的第n
个星期。
?用法
Cron 表达式中,?
主要用于 日
和 星期
字段,表示“不指定具体的值”,它的作用通常是避免日和星期字段之间的冲突。
示例 1:在 日
字段使用 ?
假设你想在每个星期五执行任务,并且不关心日期,可以在 日
字段中使用 ?
。
表达式:0 0 1-7 * 5
0 0
表示在午夜 12 点执行。1-7
表示每月的 1 号到 7 号。*
表示每月都执行。5
表示每周的星期五。
由于你已经指定了星期五(5
),但如果你还在 日
字段指定了一个值(例如 1-7
),这可能会导致冲突,因为每个月的 1 号到 7 号可能有多次星期五。为了避免这种情况,日
字段可以使用 ?
,表示不关心日期,而只关心星期。
正确的表达式:0 0 ? * 5
0 0
:午夜 12 点执行。?
:不指定具体日期。*
:每个月都执行。5
:每周的星期五。
这表示每月的每个星期五午夜 12 点执行任务,不考虑日字段。
示例 2:在 星期
字段使用 ?
如果你想指定任务在某个月的某一天执行,而不关心星期几是什么,你可以在 星期
字段使用 ?
。
表达式:0 0 15 * ?
0 0
表示在午夜 12 点执行。15
表示每个月的 15 号。*
表示每月都执行。?
表示星期不关心,避免和日字段冲突。
这表示每月的 15 号午夜执行任务,无论那一天是星期几。
示例 3:结合 日
和 星期
字段
有时,你可能想在某个月的特定日期和星期几执行任务,但又不希望两个字段产生冲突。这时可以结合 ?
来处理。
假设你想在每个月的 1 号和每个星期三执行任务。
表达式:0 0 1 * 3
0 0
表示在午夜 12 点执行。1
表示每个月的 1 号。*
表示每月都执行。3
表示每周的星期三。
这里的 1
和 3
是可以共存的,不会冲突,因为 Cron 会按顺序检查。如果你不想在某个月的 1 号和星期三两者同时出现时执行,可以通过在 日
或 星期
字段使用 ?
来避免这种冲突。
例如,0 0 1 * ?
表示在每月的 1 号执行,而不关心星期几。
总结:
当你在
日
字段指定具体日期时,可以在星期
字段使用?
,表示不关心星期几。当你在
星期
字段指定具体星期几时,可以在日
字段使用?
,表示不关心日期。
L用法
在 Cron 表达式中,L
是一个特殊字符,它表示“最后”的意思,通常用于“日”和“星期”字段。
1. L
在日字段中的使用
在 日 字段中,L
表示该月的“最后一天”,即每个月的最后一天。
示例:
0 0 L * *
:这个表达式表示在每个月的最后一天的午夜 12 点执行任务。0 0
:午夜 12 点。L
:每个月的最后一天。
2. L
在星期字段中的使用
在 星期 字段中,L
表示该月的“最后一个星期几”。这意味着如果你指定某个星期几,并使用 L
,Cron 将在该月的最后一次出现该星期几时执行任务。
示例:
0 0 * * 5L
:这个表达式表示在每个月的最后一个星期五的午夜 12 点执行任务。0 0
:午夜 12 点。* *
:每个月的每一天。5L
:每个月的最后一个星期五。
3. L
和数字结合使用
L
也可以与数字结合使用,表示从某个特定的天或星期几开始的最后一天。
示例 1:L
与数字结合使用,表示“倒数第 N 天”
在 日 字段,L
后面可以跟一个数字,表示从该月的最后一天开始倒数的第 N 天。
0 0 15L * *
:表示每个月的倒数第 15 天执行任务。
示例 2:L
与数字结合使用,表示“倒数第 N 个星期几”
在 星期 字段,L
后面可以跟一个数字,表示每个月的倒数第 N 个星期几。
0 0 * * 5L
:表示每个月的最后一个星期五执行任务。
W的用法
在 Cron 表达式中,W
是一个特殊字符,用于指定一个“工作日”。它通常用于 日 字段,用来表示离指定日期最近的工作日(星期一至星期五)。
示例 1:每个月的第 15 号的最近工作日执行任务
Cron 表达式:
0 12 15W * *
解释:
0
:表示任务在 0 分钟执行。12
:表示任务在 12 点执行。15W
:表示每个月的 15 号的最近工作日执行任务。如果 15 号是周六或周日,则会选择下一个星期一(工作日)执行;如果 15 号本身是工作日(星期一到星期五),任务就在该天执行。*
:表示每个月。*
:表示每周的任何一天。
示例 2:每个月的第 1 号的最近工作日执行任务
Cron 表达式:
0 9 1W * *
解释:
0
:表示任务在 0 分钟执行。9
:表示任务在 9 点执行。1W
:表示每个月的 1 号的最近工作日执行任务。如果 1 号是周六或周日,任务会在下一个周一(工作日)执行。如果 1 号本身是工作日,则任务在 1 号当天执行。*
:表示每个月。*
:表示每周的任何一天。
示例 3:每个月的第 10 号的最近工作日执行任务
Cron 表达式:
0 18 10W * *
解释:
0
:表示任务在 0 分钟执行。18
:表示任务在 18 点执行。10W
:表示每个月的 10 号的最近工作日执行任务。如果 10 号是周六或周日,任务会在下一个周一(工作日)执行。如果 10 号本身是工作日,则任务在 10 号当天执行。*
:表示每个月。*
:表示每周的任何一天。
示例 4:每个星期三的最近工作日执行任务(假设某个月的 3 号是周六)
Cron 表达式:
0 8 3W * 3
解释:
0
:表示任务在 0 分钟执行。8
:表示任务在 8 点执行。3W
:表示每个月的 3 号的最近工作日执行任务。假设 3 号是周六,任务将会在下一个星期一(工作日)执行。*
:表示每个月。3
:表示任务在星期三执行。
示例 5:每个月的最后一个工作日执行任务
Cron 表达式:
0 17 LW * *
解释:
0
:表示任务在 0 分钟执行。17
:表示任务在 17 点执行。LW
:表示每个月的最后一个工作日执行任务。如果这个月的最后一天是周六或周日,任务会在前一个星期五执行。*
:表示每个月。*
:表示每周的任何一天。
#的用法
#
用于星期字段(即 Cron 表达式中的第 5 个字段),其语法为 n#x
,表示该月的第 x
次 n
星期。
n
表示星期几(0 - 6),其中0
代表星期天,1
代表星期一,依此类推。x
表示该月中的第x
次n
星期(例如,第 1 次、第 2 次、第 3 次等)。
示例 1:每个月的第二个星期三执行任务
Cron 表达式:
0 12 * * 3#2
解释:
0
:任务在 0 分钟执行。12
:任务在 12 点执行。*
:任务可以在任何日期执行。*
:任务可以在任何月份执行。3#2
:表示每个月的第二个星期三执行任务。3
表示星期三,#2
表示第二次出现的星期三。
示例 2:每个月的第一个星期五执行任务
Cron 表达式:
0 9 * * 5#1
解释:
0
:任务在 0 分钟执行。9
:任务在 9 点执行。*
:任务可以在任何日期执行。*
:任务可以在任何月份执行。5#1
:表示每个月的第一个星期五执行任务。5
表示星期五,#1
表示第一个星期五。
示例 3:每个月的第三个星期二执行任务
Cron 表达式:
0 15 * * 2#3
解释:
0
:任务在 0 分钟执行。15
:任务在 15 点执行。*
:任务可以在任何日期执行。*
:任务可以在任何月份执行。2#3
:表示每个月的第三个星期二执行任务。2
表示星期二,#3
表示第三次出现的星期二。
示例 4:每个月的最后一个星期日执行任务
Cron 表达式:
0 18 * * 0#L
解释:
0
:任务在 0 分钟执行。18
:任务在 18 点执行。*
:任务可以在任何日期执行。*
:任务可以在任何月份执行。0#L
:表示每个月的最后一个星期天执行任务。0
表示星期天,#L
表示该月的最后一次星期天。
参考连接
https://www.runoob.com/linux/linux-comm-crontab.html
https://chatgpt.com/