沒有一個開發(fā)人員愿意把所有時間都花在繁瑣的任務(wù)上,比如系統(tǒng)維護(hù)和管理、日常數(shù)據(jù)庫備份以及定期下載文件和電子郵件。你更愿意專注于富有成效的工作,而不是跟蹤這些煩人的瑣事何時需要完成?!就扑]學(xué)習(xí):《nodejs 教程》】
這時就需要使用到任務(wù)調(diào)度,它將幫助您解決這樣的問題。
任務(wù)調(diào)度使您能夠計劃任意代碼(方法/函數(shù))和命令在固定日期和時間、重復(fù)間隔或指定間隔后執(zhí)行一次。在 Linux 操作系統(tǒng)中,任務(wù)調(diào)度通常由諸如 cron 之類的實(shí)用程序服務(wù)在操作系統(tǒng)級別處理。
在 Node.js 應(yīng)用程序中,類似于 cron 的功能,我們可以使用 node-cron 這樣的包實(shí)現(xiàn)。正如開發(fā)者所介紹的,node-cron 是基于 GNU crontab 的 node.js 純 JavaScript 中的微型任務(wù)調(diào)度器。
crontab 是 Linux 系統(tǒng)的定時任務(wù)執(zhí)行器。cron 的操作由 crontab 文件驅(qū)動,該文件是一個配置文件,其中包含對 cron 守護(hù)程序的指令。node-cron
模塊允許我們使用完整的 crontab 語法在 Node 中調(diào)度任務(wù)。
推薦工具
crontab 編輯器:在線工具可以可視化生成 crontab 的配置文件。
crontab 語法如下所示:
# ┌────────────── second (可選) # │ ┌──────────── 分鐘 (minute,0 - 59) # │ │ ┌────────── 小時 (hour,0 - 23) # │ │ │ ┌──────── 一個月中的第幾天 (day of month,1 - 31) # │ │ │ │ ┌────── 月份 (month,1 - 12) # │ │ │ │ │ ┌──── 星期中星期幾 (day of week,0 - 6) 注意:星期天為 0 # │ │ │ │ │ │ # │ │ │ │ │ │ # * * * * * *
允許的 cron 值包括以下內(nèi)容。
字段 | 值 |
---|---|
second |
0–59 |
minute |
0–59 |
hour |
0–23 |
day of the month |
1–31 |
month |
1–12(或月份簡寫 Jan、Feb…) |
day of the week |
0–7(或 Jan、Feb…,0 或 7 是星期日) |
下面我們來看看它的一些用法和用例。
使用 node-cron
使用 npm
安裝 node-cron
模塊。
$ npm install --save node-cron
任務(wù)調(diào)度語法
cron.schedule(cronExpression: string, task: Function, options: Object)
選項(xiàng)
scheduled
:一個布爾值(boolean
),用于設(shè)置創(chuàng)建的任務(wù)是否已安排(默認(rèn)值為true
)。timezone
:用于任務(wù)調(diào)度的時區(qū)。有關(guān)有效值,可參考 moment-timezone。
看看下面的例子。
const cron = require('node-cron') cron.schedule('5 * * * * *', () => { console.log('每分鐘在第 5 秒運(yùn)行一個任務(wù)') })
時間規(guī)范的位置 2、3、4、5 和 6 中的星號(*
)類似于用于時間劃分的文件 glob 或通配符;它們分別指定每分鐘、每小時、每月的每一天、每月和每周的每一天。
以下代碼將在每天凌晨 5:30 運(yùn)行。
const cron = require('node-cron') cron.schedule('30 5 * * *', () => { console.log('每天凌晨 5:30 運(yùn)行任務(wù)') })
任務(wù)調(diào)度提示和技巧
現(xiàn)在我們已經(jīng)了解了基本知識,讓我們做一些更有趣的事情。
假設(shè)您希望在每周五下午 4 點(diǎn)運(yùn)行一項(xiàng)特定任務(wù)。代碼如下所示:
const cron = require('node-cron') cron.schedule('0 16 * * friday', () => { console.log('每周五下午 4:00 運(yùn)行任務(wù)') })
或者,您可能需要每季度運(yùn)行一次數(shù)據(jù)庫備份。crontab 語法沒有一個月的最后一天選項(xiàng),因此您可以使用下個月的第一天,如下所示。
const cron = require('node-cron') cron.schedule('2 3 1 1,4,7,10 *', () => { console.log('在每個季度的第一天運(yùn)行任務(wù)') })
下面顯示的任務(wù)在上午 10:05 到下午 6:05 之間每小時運(yùn)行五分鐘。
const cron = require('node-cron') cron.schedule('5 10-18 * * *', () => { console.log('在上午 10 點(diǎn)到下午 6 點(diǎn)之間每小時運(yùn)行五分鐘的任務(wù)') })
在某些情況下,您可能需要每兩小時、三小時或四小時運(yùn)行一次任務(wù)。您可以通過將小時數(shù)除以所需的時間間隔來完成此操作,例如,每四小時 *4
,或在上午 12 點(diǎn)到下午 12 點(diǎn)之間每三小時運(yùn)行 0-12/3
。
分鐘也可以用同樣的方法劃分。例如,minutes
位置的表達(dá)式為 */10
,表示每10分鐘運(yùn)行一次任務(wù)。
下面的任務(wù)在上午 8 點(diǎn)到下午 5:58 之間每兩小時運(yùn)行五分鐘。
const cron = require('node-cron') cron.schedule('*/5 8-18/2 * * *', () => { console.log('在上午 8 點(diǎn)到下午 5:58 之間每兩小時運(yùn)行一次任務(wù)。') })
定時任務(wù)方法
在結(jié)束之前,讓我們關(guān)注一下三個關(guān)鍵的定時任務(wù)方法。
開始任務(wù)
將 scheduled
選項(xiàng)值設(shè)置為 false
時,任務(wù)將被調(diào)度,但無法啟動,即使 cron 表達(dá)式正在滴答作響。
要啟動這樣的任務(wù),您需要調(diào)用 start
方法。
const cron = require('node-cron')const task = cron.schedule('*/5 8-18/2 * * *', () => { console.log('在上午 8 點(diǎn)到下午 5:58 之間每兩小時運(yùn)行一次任務(wù)。') }) task.start()
停止任務(wù)
如果需要停止任務(wù)運(yùn)行,可以使用 stop
方法將 scheduled
選項(xiàng)設(shè)置為 false
。除非重新啟動,否則不會執(zhí)行該任務(wù)。
const cron = require('node-cron')const task = cron.schedule('*/5 8-18/2 * * *', () => { console.log('在上午 8 點(diǎn)到下午 5:58 之間每兩小時運(yùn)行一次任務(wù)。') }) task.stop()
銷毀任務(wù)
destroy
方法停止任務(wù)并將其完全銷毀。
const cron = require('node-cron')const task = cron.schedule('*/5 8-18/2 * * *', () => { console.log('在上午 8 點(diǎn)到下午 5:58 之間每兩小時運(yùn)行一次任務(wù)。') }) task.destroy()
以上便是 node-cron
的大部分功能,您應(yīng)該使用這些功能來安排頻繁運(yùn)行的任務(wù)。