通过node-cron实现nodejs实现定时任务/调度
Author:zhoulujun Date:
定时任务
在 Linux 中,你可以使用 cron 或 systemd 来设置定时任务。定时任务允许你在预定的时间或周期性地执行脚本、命令或程序。
systemd 和 cron的区别
systemd 和 cron 都是Linux系统中用于设置定时任务的工具,但它们之间存在一些区别:
精度和灵活性:
cron 默认支持分钟级别的精度,而systemd 可以精确到微秒级别,支持的时间单位包括微秒、毫秒、秒、分、时、日、周等。
systemd 支持比 cron 更加灵活丰富的定时规则。
资源限制:
systemd 可以对定时任务进行资源限制,而 cron 不支持。
任务执行冲突:
cron 在调度到本次任务时,如果上次调度的任务仍在执行,无法阻止本次任务重复执行,需要结合 flock 等工具来处理。
systemd 不会重复执行定时任务,如果触发定时任务时发现上次触发的任务还未执行完,那么本次触发的任务不会执行。
日志管理:
cron 的日志不直观,不方便调试任务。
systemd 将日志集成到 journal 日志系统,方便统一监控和诊断。
依赖管理:
systemd 的定时任务可以依赖于其他 systemd 服务,而 cron 不支持这种依赖关系。
管理命令:
systemd 使用 systemctl 命令来管理定时单元,类似于管理 systemd 服务。
定时任务类型:
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 中的微型任务调度器。
看看下面的例子。
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