【问题标题】:How to manage Cron Jobs in Node.js如何在 Node.js 中管理 Cron 作业
【发布时间】:2020-08-05 21:50:04
【问题描述】:

是否有任何 node.js 库允许您创建 n 个提供某种密钥的 cron 作业,然后可以通过密钥删除/编辑特定作业?

例如,我正在寻找这样的东西:

import cronManagerLibrary from 'library';

export const startJob = (key) => {
  cronManagerLibrary.addJob(key, '10 * * * * *', function);
}

export const removeJob = (key) => {
  cronManagerLibrary.removeJob(key);
}

export const updateJob = (key) => {
  cronManagerLibrary.updateJob(key, interval);
}

export const listJobs = () => {
  cronManagerLibrary.list();
}

更新:

我发现这个库 cron-job-manager 完全符合我的需要,但我不确定如何保存作业列表,因为我每次都需要创建一个作业管理器对象...

这是我尝试过的:

import CronJobManager from 'cron-job-manager';

export startJob = (key) => {
  const manager = new CronJobManager();
  taskFunction = () => {
    console.log('CRON JOB RUNNING');
  }
  manager.add(key,'10 * * * * *', taskFunction);
  manager.start(key);
  console.log(manager);
}

每次我调用 startJob 函数以创建新的 cron 作业时,manager 对象将不会保留之前启动的作业...有没有办法处理?

【问题讨论】:

  • 你想在 linux 操作系统或任何其他操作系统上执行此操作吗?
  • 我需要它在 Linux 操作系统上运行

标签: node.js cron


【解决方案1】:

您可以使用cron 模块来执行此操作。使用npm i cron 安装 cron。例如,

var CronJob = require('cron').CronJob;

new CronJob('* * * * * *', function () {
    console.log('You will see this message every second');
}, null, true, 'America/Los_Angeles');

查看文档了解更多信息,

如果你想做更多的 cron 活动,你可以随时使用任何终端命令。见下面的例子,

var exec = require('child_process').exec;

exec("crontab -l", function(err, stdout, stderr) {
    console.log(stdout);
});

【讨论】:

  • 文档中没有具体说明如何获取正在运行的作业列表...您知道如何实现这一点吗?
  • 你有linux bash终端的经验吗?你说得对吗?
  • 是的,但我需要使用节点检索活动作业。我认为crontab 对此有所帮助。
  • 列出作业似乎不起作用......即使有正在运行的作业,它也会返回 'no crontab for [user]
  • 这应该和在你的终端上运行一样,所以不能。尝试在终端上运行该命令并查看
【解决方案2】:

这应该可以解决问题,管理您的 cron 作业!

import { CronJob } from 'cron';

export class CronManager {
    constructor() {
        this._jobs = {};
    }
    add(name, periodText, fn) {
        this._jobs[name] = {
            name,
            cron: new CronJob(periodText, fn, null, true)
        };
    }
    stop(name) {
        delete this._jobs[name];
    }
    delete(name) {
        delete this._jobs[name];
    }
    stopAll() {
        for (let cron in this._jobs) {
            let activeCron = this._jobs[cron].cron.running;
            if (activeCron.running) {
                activeCron.stop();
            }
        }
    }
    list() {
        return this._jobs;
    }
    running(name) {
        return this._jobs[name].cron.running;
    }
    lastDate(name) {
        return this._jobs[name].cron.lastDate();
    }
    nextDates(name) {
        return this._jobs[name].cron.nextDates();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-06
    • 2018-06-20
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多