利用 cron 实现 Node.js 的定时任务
一般的「定时任务」分两种,第一种是「间隔 xx 时间执行」,第二种是「在每x月/日/小时/分钟/秒」执行,又叫「周期任务」。前者使用 setInterval
比较容易做到,而后者就麻烦了。
我们可以使用 Node.js 的 cron
库来实现。
安装
1 |
|
原理
cron
使用 cron 表达式(维基百科,百度百科),所以需要对它的语法有一定的了解,下面简单叙述:
如果你不想看,有在线工具可以帮你生成 cron 表达式。
Cron 表达式是一个具有时间含义的字符串,字符串以 5 个空格隔开,分为 6 个域,格式为X X X X X X。其中 X 是一个域的占位符。单个域有多个取值时,使用半角逗号 ,
隔开取值。每个域可以是确定的取值,也可以是具有逻辑意义的特殊字符。
这 6 个域分别为秒、分钟、小时、星期、月份和星期,具体含义如下:
域 | 取值范围 | 特殊字符 |
---|---|---|
秒 | [0, 59] |
* , - / |
分钟 | [0, 59] |
* , - / |
小时 | [0, 23] |
* , - / |
日期 | [1, 31] |
* , - / ? L W |
月份 | [1, 12] 或 [JAN, DEC] |
* , - / |
星期 | [1, 7] (1代表星期一,7代表星期日)或 [MON, SUN] |
* , - / ? L # |
除了上面的取值范围 ,每个域还支持一些特殊字符,它们的含义如下:
特殊字符 | 含义 | 示例 |
---|---|---|
* |
所有可能的值 | 在月域中,* 表示每个月;在星期域中,* 表示星期的每一天。 |
, |
列出枚举值 | 在分钟域中,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 表示某月的第二个星期四。 |
下面是一些例子:
示例 | 说明 |
---|---|
0 15 10 ? * * |
每天上午 10:15 执行任务 |
0 15 10 * * ? |
每天上午 10:15 执行任务 |
0 0 12 * * ? |
每天中午 12:00 执行任务 |
0 0 10,14,16 * * ? |
每天上午 10:00 点、下午 14:00 以及下午 16:00 执行任务 |
0 0/30 9-17 * * ? |
每天上午 09:00 到下午 17:00 时间段内每隔半小时执行任务 |
0 * 14 * * ? |
每天下午 14:00 到下午 14:59 时间段内每隔 1 分钟执行任务 |
0 0-5 14 * * ? |
每天下午 14:00 到下午 14:05 时间段内每隔 1 分钟执行任务 |
0 0/5 14 * * ? |
每天下午 14:00 到下午 14:55 时间段内每隔 5 分钟执行任务 |
0 0/5 14,18 * * ? |
每天下午 14:00 到下午 14:55、下午 18:00 到下午 18:55 时间段内每隔 5 分钟执行任务 |
0 0 12 ? * WED |
每个星期三中午 12:00 执行任务 |
0 15 10 15 * ? |
每月 15 日上午 10:15 执行任务 |
0 15 10 L * ? |
每月最后一日上午 10:15 执行任务 |
0 15 10 ? * 6 L |
每月最后一个星期六上午 10:15 执行任务 |
0 15 10 ? * 6#3 |
每月第三个星期六上午 10:1 5执行任务 |
0 10,44 14 ? 3 WED |
每年3月的每个星期三下午 14:10 和 14:44 执行任务 |
用法
1 |
|
例子
一个朋友需要写一个定时任务,在每天的上午 10 点往群里发消息,就可以这么实现:
1 |
|