2011-04-12 24 views
24

是否有可能在node.js中的特定時間定期調用函數?我的第一個執行是node.js中的Cronjobs

setInterval(functionName(),(24*60*60*1000)); 

這是最理想的,因爲它會重新開始我每次重新啓動節點的時間。有更好的可能性來實現這個嗎?

+7

使用[node-cron](https://github.com/ncb000gt/node-cron)。 – 2011-04-12 13:35:49

+3

@MathiasBynens [node-cron](https://github.com/ncb000gt/node-cron)如何抵抗重啓?對不起,作爲necromant,但這個Q仍然是谷歌搜索結果中的第一個。請注意,'node-cron'不是基於crontables的。 – meeDamian 2013-04-25 10:04:34

+0

@meeDamian node-cron主要按間隔運行腳本,因此它們將在重新啓動時再次開始循環。還有一個選項可以[按日期]運行一次作業(https://www.npmjs.com/package/cron#another-example-with-date),這是一個可能來自持久數據的值資源。 – igneosaur 2016-04-26 00:06:43

回答

21

爲防止重新啓動,您需要創建持久性數據存儲作業。

喜歡的東西:

Job = { 
    _id: Number, 
    job: String, 
    dueDate: Date, 
    completed: Boolean 
} 

然後有一些代碼如下:

var createJob = function(url, date) { 
    var j = db.create(Job, function(j) { 
     j.job = url; 
     j.dueDate = date; 
     j.save(); 
    }); 
}; 

var runJob = function(j) { 
    var id = j._id; 
    setInterval(j.dueDate - Date.now(), function() { 
     db.getOne(Job, { _id : id }, function(j) { 
      require(j.job); 
      j.finished = true; 
      j.save(); 
     }); 
    }); 
    j = null; 
}; 

在啓動時你就必須這樣做:

db.get(Job, { finished: false }, function(jobs) { 
    jobs.forEach(runJob); 
}); 

更換通用db與MongoDB,CouchDB,Redis等。

+0

假設有多個cron作業正在運行,有什麼辦法只是簡單地殺死其中的一個?因爲我遇到了一個場景,我需要殺死一個工作並做了其他一些維護工作,但我仍然希望其他工作正在運行。謝謝! – zsong 2013-04-24 19:27:41

0

這是一個古老的問題,但除了被接受的答案之外,一個帶有例子的圖書館值得一提。

cron是一個輕量級的軟件包,它在給定的時間間隔運行指定的函數,僅使用系統的時間和無數據庫持久性。

const CronJob = require('cron').CronJob; 
const jobFiveMinutes = require("./job.five-minutes"); 
const jobMondayMorning = require("./job.monday-morning"); 

var jobs = [ 
    new CronJob({ 
     cronTime: "00 */5 * * * *", //every five minutes 
     onTick: function() { 
      jobFiveMinutes(); 
     }, 
     start: false, //don't start immediately 
     timeZone: 'America/Los_Angeles' 
    }), 
    new CronJob({ 
     cronTime: "00 00 9 * * 1", //9 am Monday morning 
     onTick: function() { 
      jobMondayMorning(); 
     }, 
     start: false, 
     timeZone: 'America/Los_Angeles' 
    }), 
]; 

jobs.forEach(function(job) { 
    job.start(); //start the jobs 
}); 

上面我們需要兩個文件,並在兩個cronjob中調用它們,並設置爲不同的時間間隔。該文件只是導出功能:

//job.five-minutes.js 
module.exports = function(){ 
    console.log("runs every five minutes") 
}; 

//job.monday-morning.js 
module.exports = function(){ 
    console.log("runs every monday morning at 9 am, Los Angeles time") 
}; 

無論您在任何地區本地或遠程服務器上運行它,它會根據傳遞的時區運行(這是可選的,雖然,不要緊,以分鐘爲單位的情況下) 。

此外,重新啓動服務器/腳本將不會影響其工作,因爲它與系統時間同步。作業將在5的每個倍數上運行,即5,10,15,20等等。因此,即使您在24重新啓動腳本,它也會以25而不是29運行。

最後,該軟件包已將cron語法擴展爲在最左側包含秒。因此,你甚至可以知道你想要在哪一秒鐘完成任務。