• home > webfront > ECMAS > nodejs >

    通过node-cron实现nodejs实现定时任务/调度

    Author:zhoulujun Date:

    定时任务在 Linux 中,你可以使用 cron 或 systemd 来设置定时任务。定时任务允许你在预定的时间或周期性地执行脚本、命令或程序。sy

    定时任务

    在 Linux 中,你可以使用 cron 或 systemd 来设置定时任务。定时任务允许你在预定的时间或周期性地执行脚本、命令或程序。

    systemd 和 cron的区别

    systemd 和 cron 都是Linux系统中用于设置定时任务的工具,但它们之间存在一些区别:

    1. 精度和灵活性:

      • cron 默认支持分钟级别的精度,而systemd 可以精确到微秒级别,支持的时间单位包括微秒、毫秒、秒、分、时、日、周等。

      • systemd 支持比 cron 更加灵活丰富的定时规则。

    2. 资源限制:

      • systemd 可以对定时任务进行资源限制,而 cron 不支持。

    3. 任务执行冲突:

      • cron 在调度到本次任务时,如果上次调度的任务仍在执行,无法阻止本次任务重复执行,需要结合 flock 等工具来处理。

      • systemd 不会重复执行定时任务,如果触发定时任务时发现上次触发的任务还未执行完,那么本次触发的任务不会执行。

    4. 日志管理:

      • cron 的日志不直观,不方便调试任务。

      • systemd 将日志集成到 journal 日志系统,方便统一监控和诊断。

    5. 依赖管理:

      • systemd 的定时任务可以依赖于其他 systemd 服务,而 cron 不支持这种依赖关系。

    6. 管理命令:

      • systemd 使用 systemctl 命令来管理定时单元,类似于管理 systemd 服务。

    7. 定时任务类型:

      • systemd 支持两种类型的定时任务:realtime(类似于 cron)和monotonic(基于非时间事件触发的任务)。

    从上面来看,systemd无非是最好的选择,毕竟比cron优秀太多,但是,一般情况下,我们还是选择cron来做定时任务

    因为Cron是一个在Unix、BSD、Linux和类Unix操作系统中的时间基础的作业调度程序。而systemd只能在linux上面跑,而且平时,对于一些简单的任务,我们使用cron足够了,对于复杂的,交给运维去处理!

    crontab

    cron 是一个用于在预定时间执行命令的服务。它使用 crontab 来管理定时任务。每个用户都有一个对应的 crontab 文件,允许该用户设置定时任务。

    cron常用命令列表:

    查看现有定时任务:crontab -l

    删除定时任务:crontab -r

    编辑定时任务:crontab -e,这将打开一个温碧编辑器,比如写入 0 3 * * * /path/to/your/script.sh

    定时任务时间格式说明


    特殊符号说明

    特殊符号含义
    *代表任何时间。比如第一个“*”代表一小时中每分钟都执行一次的意思
    n表示每 n 个时间单位运行一次。例如,*/5 * * * * 表示每 5 分钟运行一次。
    代表不连续时间。比如“0,8,12,16* * *命令”,代表在每天的8点0分,12点0分,16点0分都执行一次命令
    -代表连续的时间范围。比如“0 5 * * 1-6命令”,代表周一到周六的凌晨5点0分执行命令
    */n代表每隔多久执行一次。比如“*/10 * * * * 命令” ,代表每个十分钟就执行一次命令

    参数细节说明

    项目含义范围
    第一个“*”一个小时当中的第几分钟0~59
    第二个“*”一天当中的第几小时0~23
    第三个“*”一个月当中的第几天1~31
    第四个“*”一年当中的第几月1~12
    第五个“*”一周当中的星期几0~7(0和7都代表星期日)

    crontab 语法如下所示:

    ┌────────────── second (可选)
    │ ┌──────────── 分钟 (minute,0 - 59)
    │ │ ┌────────── 小时 (hour,0 - 23)
    │ │ │ ┌──────── 一个月中的第几天 (day of month,1 - 31)
    │ │ │ │ ┌────── 月份 (month,1 - 12)
    │ │ │ │ │ ┌──── 一个星期中星期几 (day of week,0 - 6) 注意:星期天为 0
    │ │ │ │ │ │
    │ │ │ │ │ │
    * * * * * *


    特定时间执行任务案例

    时间含义
    45 22 * * *在22点45分执行命令
    0 17 * * 1每周一的17点0分执行命令
    0 5 1,15 * *每月1号和15号的早上五点执行命令
    40 4 * * 1-5每周一到周五早上四点四十分执行命令
    */10 4 * * *每天早上四点,每隔十分钟hi i选哪个一次命令
    0 0 1,15 * 1每月1号和15号,每周一的凌晨0点0分都会执行命令

    注意星期几和几天最好不要同时出现,因为他们定义的都是天


    node-cron

    node-cron 是基于 GNU crontab 的 node.js 纯 JavaScript 中的微型任务调度器。

    v2-bf65e7813a87fd29f68a0a5a95bd8827_720w.webp

    看看下面的例子。

    const cron = require('node-cron')
    
    const task = cron.schedule('*/5 8-18/2 * * *', () => {
      console.log('从上午 8 点到下午 18 点,每 2 小时后的每 5 分钟运行一次任务')
    })
    
    //task.start()// 启动
    // task.stop()//停止任务
    // task.destroy()//销毁任务

    备份数据库,完整示例如下:

    const cron = require('node-cron')
    const shell = require('shelljs')
    
    // 每天晚上 11:59 备份数据库
    cron.schedule('59 23 * * *', () => {
      if (shell.exec('sqlite3 database.sqlite .dump > data_dump.sql').code !== 0) {
        shell.exit(1)
      } else {
        shell.echo('数据库备份完成')
      }
    })

    定时发送预定的电子邮件

    const cron = require('node-cron')
    const nodemailer = require('nodemailer')
    
    // 创建邮件传输器
    let transporter = nodemailer.createTransport({
      host: 'your_demo_email_smtp_host.example.com',
      port: your_demo_email_port,
      auth: {
        user: '[email protected]',
        pass: 'your_demo_email_password'
      }
    })
    
    // 每周五发送邮件
    cron.schedule('0 0 * * 5', () => {
      let messageOptions = {
        from: '[email protected]',
        to: '[email protected]',
        subject: '预定电子邮件',
        text: '你好,这封电子邮件是公司自动发送的。'
      }
    
      transporter.sendMail(messageOptions, (error, info) => {
        if (error) {
          throw error
        } else {
          console.log('电子邮件已成功发送!')
        }
      })
    })



    转载本站文章《通过node-cron实现nodejs实现定时任务/调度》,
    请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/JS-Server/9314.html