使用 Node-Cron 每 10 秒执行一次 Cron 作业 admin 2023-07-17 11:21:02 技术标签: 【中文标题】使用 Node-Cron 每 10 秒执行一次 Cron 作业【英文标题】:Cron Job every 10 seconds with Node-Cron 【发布时间】:2015-07-29 12:18:04 【问题描述】: 我使用 Node-Cron 每 10 秒运行一次 cron 作业。但似乎node-cron存在问题。 https://github.com/ncb000gt/node-cron#cron-ranges我在04:28:34 提出了请求,但脚本从4:28:40 开始(应该从04:28:44 开始)我在04:48:58 提出了请求,但脚本从04:49:00 开始(应该从04:49:08 开始)我在05:03:45 提出了请求,但脚本从05:03:50 开始(应该从04:49:08 开始)以下是我执行此任务的代码。router.post("/secret", function (req, res) console.log("Post request!"); console.log("Start At:" + getUTCDateTime()); function getUTCDateTime() var date = new Date(); var dateUTC = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); var hour = dateUTC.getHours(); hour = (hour < 10 ? "0" : "") + hour; var min = dateUTC.getMinutes(); min = (min < 10 ? "0" : "") + min; var sec = dateUTC.getSeconds(); sec = (sec < 10 ? "0" : "") + sec; var year = dateUTC.getFullYear(); var month = dateUTC.getMonth() + 1; month = (month < 10 ? "0" : "") + month; var day = dateUTC.getDate(); day = (day < 10 ? "0" : "") + day; return year + "-" + month + "-" + day + " " + hour + ":" + min + ":" + sec; // format: 2015-04-10 11:40:50 function getEndDateTime(startAt, callback) var date = new Date(startAt); date.setSeconds(date.getSeconds() + parseInt(callback)); var sec = date.getSeconds(); sec = (sec < 10 ? "0" : "") + sec; var hour = date.getHours(); hour = (hour < 10 ? "0" : "") + hour; var min = date.getMinutes(); min = (min < 10 ? "0" : "") + min; var year = date.getFullYear(); var month = date.getMonth() + 1; month = (month < 10 ? "0" : "") + month; var day = date.getDate(); day = (day < 10 ? "0" : "") + day; return year + "-" + month + "-" + day + " " + hour + ":" + min + ":" + sec; // format: 2015-04-10 11:40:50 function getStartDateTime(startAt, callback) var date = new Date(startAt); date.setSeconds(date.getSeconds() - parseInt(callback)); var sec = date.getSeconds(); sec = (sec < 10 ? "0" : "") + sec; var hour = date.getHours(); hour = (hour < 10 ? "0" : "") + hour; var min = date.getMinutes(); min = (min < 10 ? "0" : "") + min; var year = date.getFullYear(); var month = date.getMonth() + 1; month = (month < 10 ? "0" : "") + month; var day = date.getDate(); day = (day < 10 ? "0" : "") + day; return year + "-" + month + "-" + day + " " + hour + ":" + min + ":" + sec; // format: 2015-04-10 11:40:50 function callBackUrl(url, data) var request = require("request"); request.post( url, form: data: data, function (error, response, body) if (!error && response.statusCode == 200) console.log(body) ); var startAt = req.body.startAt; var callback = req.body.callback; var endAt = req.body.endAt; //2015-05-15 11:23:50 var data = req.body.data; if (callback == "" || endAt == "" || data == "") res.end("Params cannot be empty: " + JSON.stringify(req.body)); if (getUTCDateTime() >= endAt) res.end("Param "endAt" is invalid: " + JSON.stringify(req.body)); var jsonObject = JSON.parse(data); //to get the JSON object of the string var callbackUrl1 = "http://qa.www.com/index.php/api/default/test/id/1"; var callbackUrl2 = "http://qa.www.com/index.php/api/default/test/id/2"; //cronStartAt = "0 */" + callback + " * * * *"; // only every 1 minute cronStartAt = "*/" + callback + " * * * * *"; // only every 1 minute var nowCount = 0; var CronJob = require("cron").CronJob; var cron = new CronJob(cronStartAt, function () nowCount++; var tmpStartAt = getStartDateTime(getUTCDateTime(), callback); var tmpEndAt = getUTCDateTime(); //var tmpStartAt = getUTCDateTime(); //var tmpEndAt = getEndDateTime(tmpStartAt, callback); //console.log(tmpStartAt + " " + tmpEndAt); jsonObject.startAt = tmpStartAt; jsonObject.endAt = tmpEndAt; data = JSON.stringify(jsonObject); callBackUrl(callbackUrl1, data); if (getUTCDateTime() >= endAt) cron.stop(); console.log("stopped at: " + getUTCDateTime()); console.log("now count: " + nowCount); , function () /* This function is executed when the job stops */ // on crone stop another http call with submitted post data callBackUrl(callbackUrl2, data); , true, "America/Los_Angeles"); cron.start(); console.log("Post body: %j", req.body); res.end("Body: " + JSON.stringify(req.body));); 【问题讨论】: callback 中的值是多少?还有你如何衡量作业的执行时间? Can a cron job run every "x" seconds的可能重复 【参考方案1】: 这对我有用 - cron.schedule("*/10 * * * * *", function() console.log("running a task every 10 second"); );希望这对某人有所帮助。参考 - https://support.acquia.com/hc/en-us/articles/360004224494-Cron-time-string-format 【讨论】:以上是关于使用 Node-Cron 每 10 秒执行一次 Cron 作业的主要内容,如果未能解决你的问题,请参考以下文章 什么是cache数据库 anyexec 您可能还会对下面的文章感兴趣: 相关文章 浏览器打不开网址提示“ERR_CONNECTION_TIMED_OUT”错误代码的解决方法 如何安装ocx控件 VMware的虚拟机为啥ip地址老是自动变化 vbyone和EDP区别 linux/debian到底怎么重启和关机 苹果平板键盘被弄到上方去了,如何调回正常? 机器学习常用距离度量 如何查看kindle型号