Node.js 中使用node-cron來調(diào)度任務(wù)(轉(zhuǎn)載)

沒有一個(gè)開發(fā)人員愿意把所有時(shí)間都花在繁瑣的任務(wù)上,比如系統(tǒng)維護(hù)和管理纵东、日常數(shù)據(jù)庫備份以及定期下載文件和電子郵件粘招。你更愿意專注于富有成效的工作,而不是跟蹤這些煩人的瑣事何時(shí)需要完成偎球∪髟【推薦學(xué)習(xí):《nodejs 教程》】

這時(shí)就需要使用到任務(wù)調(diào)度,它將幫助您解決這樣的問題衰絮。

任務(wù)調(diào)度使您能夠計(jì)劃任意代碼(方法/函數(shù))和命令在固定日期和時(shí)間袍冷、重復(fù)間隔或指定間隔后執(zhí)行一次。在 Linux 操作系統(tǒng)中猫牡,任務(wù)調(diào)度通常由諸如 cron 之類的實(shí)用程序服務(wù)在操作系統(tǒng)級(jí)別處理胡诗。

在 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)的定時(shí)任務(wù)執(zhí)行器瑰抵。cron 的操作由 crontab 文件驅(qū)動(dòng),該文件是一個(gè)配置文件器联,其中包含對(duì) cron 守護(hù)程序的指令二汛。node-cron 模塊允許我們使用完整的 crontab 語法在 Node 中調(diào)度任務(wù)婿崭。

推薦工具

crontab 編輯器:在線工具可以可視化生成 crontab 的配置文件。

crontab 語法如下所示:

 # ┌────────────── second (可選)
 # │ ┌──────────── 分鐘 (minute习贫,0 - 59)
 # │ │ ┌────────── 小時(shí) (hour逛球,0 - 23)
 # │ │ │ ┌──────── 一個(gè)月中的第幾天 (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:一個(gè)布爾值(boolean),用于設(shè)置創(chuàng)建的任務(wù)是否已安排(默認(rèn)值為 true)婉陷。
  • timezone:用于任務(wù)調(diào)度的時(shí)區(qū)帚称。有關(guān)有效值,可參考 moment-timezone秽澳。

看看下面的例子闯睹。

const cron = require('node-cron')

cron.schedule('5 * * * * *', () => {
  console.log('每分鐘在第 5 秒運(yùn)行一個(gè)任務(wù)')
})

時(shí)間規(guī)范的位置 2、3担神、4楼吃、5 和 6 中的星號(hào)(*)類似于用于時(shí)間劃分的文件 glob 或通配符;它們分別指定每分鐘妄讯、每小時(shí)孩锡、每月的每一天每月和每周的每一天亥贸。

以下代碼將在每天凌晨 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í),讓我們做一些更有趣的事情炕置。

假設(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 語法沒有一個(gè)月的最后一天選項(xiàng)垦沉,因此您可以使用下個(gè)月的第一天,如下所示仍劈。

const cron = require('node-cron')

cron.schedule('2 3 1 1,4,7,10 *', () => {
  console.log('在每個(gè)季度的第一天運(yùn)行任務(wù)')
})

下面顯示的任務(wù)在上午 10:05 到下午 6:05 之間每小時(shí)運(yùn)行五分鐘厕倍。

const cron = require('node-cron')

cron.schedule('5 10-18 * * *', () => {
  console.log('在上午 10 點(diǎn)到下午 6 點(diǎn)之間每小時(shí)運(yùn)行五分鐘的任務(wù)')
})

在某些情況下,您可能需要每兩小時(shí)贩疙、三小時(shí)或四小時(shí)運(yùn)行一次任務(wù)讹弯。您可以通過將小時(shí)數(shù)除以所需的時(shí)間間隔來完成此操作况既,例如,每四小時(shí) *4组民,或在上午 12 點(diǎn)到下午 12 點(diǎn)之間每三小時(shí)運(yùn)行 0-12/3棒仍。

分鐘也可以用同樣的方法劃分。例如臭胜,minutes 位置的表達(dá)式為 */10莫其,表示每10分鐘運(yùn)行一次任務(wù)

下面的任務(wù)在上午 8 點(diǎn)到下午 5:58 之間每兩小時(shí)運(yùn)行五分鐘耸三。

const cron = require('node-cron')

cron.schedule('*/5 8-18/2 * * *', () => {
  console.log('在上午 8 點(diǎn)到下午 5:58 之間每兩小時(shí)運(yùn)行一次任務(wù)乱陡。')
})

定時(shí)任務(wù)方法

在結(jié)束之前,讓我們關(guān)注一下三個(gè)關(guān)鍵的定時(shí)任務(wù)方法仪壮。

開始任務(wù)

scheduled 選項(xiàng)值設(shè)置為 false 時(shí)憨颠,任務(wù)將被調(diào)度,但無法啟動(dòng)积锅,即使 cron 表達(dá)式正在滴答作響爽彤。

要啟動(dòng)這樣的任務(wù),您需要調(diào)用 start 方法缚陷。

const cron = require('node-cron')const task = cron.schedule('*/5 8-18/2 * * *', () => {
  console.log('在上午 8 點(diǎn)到下午 5:58 之間每兩小時(shí)運(yùn)行一次任務(wù)适篙。')
})

task.start()

停止任務(wù)

如果需要停止任務(wù)運(yùn)行,可以使用 stop 方法將 scheduled 選項(xiàng)設(shè)置為 false蹬跃。除非重新啟動(dòng),否則不會(huì)執(zhí)行該任務(wù)铆铆。

const cron = require('node-cron')const task = cron.schedule('*/5 8-18/2 * * *', () => {
  console.log('在上午 8 點(diǎn)到下午 5:58 之間每兩小時(shí)運(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 之間每兩小時(shí)運(yùn)行一次任務(wù)薄货。')
})

task.destroy()

以上便是 node-cron 的大部分功能翁都,您應(yīng)該使用這些功能來安排頻繁運(yùn)行的任務(wù)。

本文轉(zhuǎn)載自:https://www.php.cn/js-tutorial-481249.html

更多編程相關(guān)知識(shí)谅猾,請(qǐng)?jiān)L問:編程視頻1俊!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末税娜,一起剝皮案震驚了整個(gè)濱河市坐搔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌敬矩,老刑警劉巖概行,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異弧岳,居然都是意外死亡凳忙,警方通過查閱死者的電腦和手機(jī)业踏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涧卵,“玉大人勤家,你說我怎么就攤上這事×郑” “怎么了伐脖?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胎撤。 經(jīng)常有香客問我晓殊,道長,這世上最難降的妖魔是什么伤提? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任巫俺,我火速辦了婚禮,結(jié)果婚禮上肿男,老公的妹妹穿的比我還像新娘介汹。我一直安慰自己,他們只是感情好舶沛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布嘹承。 她就那樣靜靜地躺著,像睡著了一般如庭。 火紅的嫁衣襯著肌膚如雪叹卷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天坪它,我揣著相機(jī)與錄音骤竹,去河邊找鬼。 笑死往毡,一個(gè)胖子當(dāng)著我的面吹牛蒙揣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播开瞭,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼懒震,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了嗤详?” 一聲冷哼從身側(cè)響起个扰,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎葱色,沒想到半個(gè)月后锨匆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年恐锣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了茅主。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡土榴,死狀恐怖诀姚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玷禽,我是刑警寧澤赫段,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站矢赁,受9級(jí)特大地震影響糯笙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撩银,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一给涕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧额获,春花似錦够庙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至境肾,卻和暖如春剔难,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奥喻。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工偶宫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衫嵌。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓读宙,卻偏偏與公主長得像彻秆,于是被迫代替她去往敵國和親楔绞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容