node-schedule库的使用

node-schedule Cron 作业调度器的完整使用指南

#resource / nodejs #type / howto #status / growing

[!info] related notes

node-schedule 库的使用

node-schedule Github

  • node-schedule 继承了 nodejs 中的 EventEmitter 类
  • 有 run、scheduled、canceled、error、success 事件

目标

使用 node-schedule 实现定时任务调度,支持 Cron 表达式、日期触发和循环规则。

前置条件

  • Node.js 16+
  • npm install node-schedule

步骤

1. Cron 式调度

使用 Cron 格式的时间来调度任务(秒 分 时 日 月 周):

import schedule from 'node-schedule';

// 每天凌晨 2:00 执行
const job = schedule.scheduleJob('0 2 * * *', () => {
  console.log('执行每日数据清理', new Date().toISOString());
});

// 每周一至周五 9:30 执行
const weekdayJob = schedule.scheduleJob('30 9 * * 1-5', () => {
  console.log('工作日早报推送');
});

// 每 5 分钟执行一次
const frequentJob = schedule.scheduleJob('*/5 * * * *', () => {
  console.log('定时健康检查');
});

2. 日期式调度

使用 Date 对象来调度任务(一次性):

const targetDate = new Date('2026-06-01T10:00:00');

const oneTimeJob = schedule.scheduleJob(targetDate, () => {
  console.log('活动开始通知');
  // 一次性任务,执行后自动结束
});

3. 循环规则调度

使用 RecurrenceRule 对象来调度任务:

const rule = new schedule.RecurrenceRule();
rule.hour = 8;
rule.minute = 30;
rule.dayOfWeek = [1, 3, 5]; // 周一三五

const ruleJob = schedule.scheduleJob(rule, () => {
  console.log('按规则执行的任务');
});

// 更细粒度的循环
const rule2 = new schedule.RecurrenceRule();
rule2.second = [0, 15, 30, 45]; // 每 15 秒
schedule.scheduleJob(rule2, () => {
  console.log('高频轮询');
});

4. 任务管理

// 获取任务名称
console.log(job.name); // 自动生成的唯一名称

// 取消任务
job.cancel();

// 监听事件
job.on('run', () => console.log('任务开始执行'));
job.on('success', () => console.log('任务执行成功'));
job.on('error', (err) => console.error('任务执行出错:', err));
job.on('canceled', () => console.log('任务被取消'));

5. 优雅关闭

import schedule from 'node-schedule';

// 关闭所有任务
function gracefulShutdown() {
  schedule.gracefulShutdown().then(() => {
    console.log('所有定时任务已停止');
    process.exit(0);
  });
}

process.on('SIGTERM', gracefulShutdown);
process.on('SIGINT', gracefulShutdown);

验证

  1. 使用 console.log 打印执行时间,确认 Cron 表达式正确
  2. 调用 job.cancel() 后确认任务不再执行
  3. 发送 SIGTERM 信号,确认所有任务优雅停止不抛异常
创建于 2025/7/16 更新于 2026/5/27