You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					305 lines
				
				11 KiB
			
		
		
			
		
	
	
					305 lines
				
				11 KiB
			| 
											3 years ago
										 | # Node Schedule
 | ||
|  | 
 | ||
|  | [](https://www.npmjs.com/package/node-schedule) | ||
|  | [](https://www.npmjs.com/package/node-schedule) | ||
|  | [](https://github.com/node-schedule/node-schedule/actions) | ||
|  | [](https://coveralls.io/r/node-schedule/node-schedule?branch=master) | ||
|  | [](https://gitter.im/node-schedule/node-schedule?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) | ||
|  | 
 | ||
|  | [](https://nodei.co/npm/node-schedule/) | ||
|  | 
 | ||
|  | Node Schedule is a flexible cron-like and not-cron-like job scheduler for Node.js. | ||
|  | It allows you to schedule jobs (arbitrary functions) for execution at | ||
|  | specific dates, with optional recurrence rules. It only uses a single timer | ||
|  | at any given time (rather than reevaluating upcoming jobs every second/minute). | ||
|  | 
 | ||
|  | Node 6+ is supported. | ||
|  | 
 | ||
|  | ## Overview
 | ||
|  | 
 | ||
|  | Node Schedule is for time-based scheduling, not interval-based scheduling. | ||
|  | 
 | ||
|  | While you can easily bend it to your will, if you only want to do something like | ||
|  | "run this function every 5 minutes", [toad-scheduler](https://github.com/kibertoad/toad-scheduler) would be a better choice. But if you want to, say, "run this function at the :20 | ||
|  | and :50 of every hour on the third Tuesday of every month," you'll find that | ||
|  | Node Schedule suits your needs better. Additionally, Node Schedule has Windows | ||
|  | support, unlike true `cron`, since the node runtime is now fully supported. | ||
|  | 
 | ||
|  | Note that Node Schedule is designed for in-process scheduling, i.e. scheduled jobs | ||
|  | will only fire as long as your script is running, and the schedule will disappear | ||
|  | when execution completes. If you need to schedule jobs that will persist even when | ||
|  | your script *isn't* running, consider using actual [cron]. | ||
|  | 
 | ||
|  | In case you need durable jobs that persist across restarts and lock system compatible with multi-node deployments, | ||
|  | try [agenda](https://github.com/agenda/agenda) or [bree](https://github.com/breejs/bree). | ||
|  | 
 | ||
|  | ## Usage
 | ||
|  | 
 | ||
|  | ### Installation
 | ||
|  | 
 | ||
|  | You can install using [npm](https://www.npmjs.com/package/node-schedule). | ||
|  | 
 | ||
|  | ``` | ||
|  | npm install node-schedule | ||
|  | ``` | ||
|  | 
 | ||
|  | 
 | ||
|  | ### Jobs and Scheduling
 | ||
|  | 
 | ||
|  | Every scheduled job in Node Schedule is represented by a `Job` object. You can | ||
|  | create jobs manually, then execute the `schedule()` method to apply a schedule, | ||
|  | or use the convenience function `scheduleJob()` as demonstrated below. | ||
|  | 
 | ||
|  | `Job` objects are `EventEmitter`s, and emit the following events: | ||
|  | * A `run` event after each execution. | ||
|  | * A `scheduled` event each time they're scheduled to run. | ||
|  | * A `canceled` event when an invocation is canceled before it's executed.   | ||
|  |   Note that `canceled` is the single-L American spelling. | ||
|  | * An `error` event when a job invocation triggered by a schedule throws or returns | ||
|  |   a rejected `Promise`. | ||
|  | * A `success` event when a job invocation triggered by a schedule returns successfully or | ||
|  |   returns a resolved `Promise`. In any case, the `success` event receives the value returned | ||
|  |   by the callback or in case of a promise, the resolved value. | ||
|  | 
 | ||
|  | (Both the `scheduled` and `canceled` events receive a JavaScript date object as | ||
|  | a parameter).   | ||
|  | Note that jobs are scheduled the first time immediately, so if you create a job | ||
|  | using the `scheduleJob()` convenience method, you'll miss the first `scheduled` | ||
|  | event, but you can query the invocation manually (see below). | ||
|  | 
 | ||
|  | ### Cron-style Scheduling
 | ||
|  | 
 | ||
|  | The cron format consists of: | ||
|  | ``` | ||
|  | *    *    *    *    *    * | ||
|  | ┬    ┬    ┬    ┬    ┬    ┬ | ||
|  | │    │    │    │    │    │ | ||
|  | │    │    │    │    │    └ day of week (0 - 7) (0 or 7 is Sun) | ||
|  | │    │    │    │    └───── month (1 - 12) | ||
|  | │    │    │    └────────── day of month (1 - 31) | ||
|  | │    │    └─────────────── hour (0 - 23) | ||
|  | │    └──────────────────── minute (0 - 59) | ||
|  | └───────────────────────── second (0 - 59, OPTIONAL) | ||
|  | ``` | ||
|  | 
 | ||
|  | Examples with the cron format: | ||
|  | 
 | ||
|  | ```js | ||
|  | const schedule = require('node-schedule'); | ||
|  | 
 | ||
|  | const job = schedule.scheduleJob('42 * * * *', function(){ | ||
|  |   console.log('The answer to life, the universe, and everything!'); | ||
|  | }); | ||
|  | ``` | ||
|  | 
 | ||
|  | Execute a cron job when the minute is 42 (e.g. 19:42, 20:42, etc.). | ||
|  | 
 | ||
|  | And: | ||
|  | 
 | ||
|  | ```js | ||
|  | const job = schedule.scheduleJob('0 17 ? * 0,4-6', function(){ | ||
|  |   console.log('Today is recognized by Rebecca Black!'); | ||
|  | }); | ||
|  | ``` | ||
|  | 
 | ||
|  | Execute a cron job every 5 Minutes = */5 * * * * | ||
|  | 
 | ||
|  | You can also get when it is scheduled to run for every invocation of the job: | ||
|  | ```js | ||
|  | const job = schedule.scheduleJob('0 1 * * *', function(fireDate){ | ||
|  |   console.log('This job was supposed to run at ' + fireDate + ', but actually ran at ' + new Date()); | ||
|  | }); | ||
|  | ``` | ||
|  | This is useful when you need to check if there is a delay of the job invocation when the system is busy, or save a record of all invocations of a job for audit purpose. | ||
|  | #### Unsupported Cron Features
 | ||
|  | 
 | ||
|  | Currently, `W` (nearest weekday) and `L` (last day of month/week) are not supported.  | ||
|  | Most other features supported by popular cron implementations should work just fine,  | ||
|  | including `#` (nth weekday of the month). | ||
|  | 
 | ||
|  | [cron-parser] is used to parse crontab instructions. | ||
|  | 
 | ||
|  | ### Date-based Scheduling
 | ||
|  | 
 | ||
|  | Say you very specifically want a function to execute at 5:30am on December 21, 2012. | ||
|  | Remember - in JavaScript - 0 - January, 11 - December. | ||
|  | 
 | ||
|  | ```js | ||
|  | const schedule = require('node-schedule'); | ||
|  | const date = new Date(2012, 11, 21, 5, 30, 0); | ||
|  | 
 | ||
|  | const job = schedule.scheduleJob(date, function(){ | ||
|  |   console.log('The world is going to end today.'); | ||
|  | }); | ||
|  | ``` | ||
|  | 
 | ||
|  | To use current data in the future you can use binding: | ||
|  | 
 | ||
|  | ```js | ||
|  | const schedule = require('node-schedule'); | ||
|  | const date = new Date(2012, 11, 21, 5, 30, 0); | ||
|  | const x = 'Tada!'; | ||
|  | const job = schedule.scheduleJob(date, function(y){ | ||
|  |   console.log(y); | ||
|  | }.bind(null,x)); | ||
|  | x = 'Changing Data'; | ||
|  | ``` | ||
|  | This will log 'Tada!' when the scheduled Job runs, rather than 'Changing Data', | ||
|  | which x changes to immediately after scheduling. | ||
|  | 
 | ||
|  | ### Recurrence Rule Scheduling
 | ||
|  | 
 | ||
|  | You can build recurrence rules to specify when a job should recur. For instance, | ||
|  | consider this rule, which executes the function every hour at 42 minutes after the hour: | ||
|  | 
 | ||
|  | ```js | ||
|  | const schedule = require('node-schedule'); | ||
|  | 
 | ||
|  | const rule = new schedule.RecurrenceRule(); | ||
|  | rule.minute = 42; | ||
|  | 
 | ||
|  | const job = schedule.scheduleJob(rule, function(){ | ||
|  |   console.log('The answer to life, the universe, and everything!'); | ||
|  | }); | ||
|  | ``` | ||
|  | 
 | ||
|  | You can also use arrays to specify a list of acceptable values, and the `Range` | ||
|  | object to specify a range of start and end values, with an optional step parameter. | ||
|  | For instance, this will print a message on Thursday, Friday, Saturday, and Sunday at 5pm: | ||
|  | 
 | ||
|  | ```js | ||
|  | const rule = new schedule.RecurrenceRule(); | ||
|  | rule.dayOfWeek = [0, new schedule.Range(4, 6)]; | ||
|  | rule.hour = 17; | ||
|  | rule.minute = 0; | ||
|  | 
 | ||
|  | const job = schedule.scheduleJob(rule, function(){ | ||
|  |   console.log('Today is recognized by Rebecca Black!'); | ||
|  | }); | ||
|  | ``` | ||
|  | 
 | ||
|  | Timezones are also supported. Here is an example of executing at the start of every day in the UTC timezone. | ||
|  | 
 | ||
|  | ```js | ||
|  | const rule = new schedule.RecurrenceRule(); | ||
|  | rule.hour = 0; | ||
|  | rule.minute = 0; | ||
|  | rule.tz = 'Etc/UTC'; | ||
|  | 
 | ||
|  | const job = schedule.scheduleJob(rule, function(){ | ||
|  |   console.log('A new day has begun in the UTC timezone!'); | ||
|  | }); | ||
|  | ``` | ||
|  | 
 | ||
|  | A list of acceptable tz (timezone) values can be found at <https://en.wikipedia.org/wiki/List_of_tz_database_time_zones> | ||
|  | 
 | ||
|  | #### RecurrenceRule properties
 | ||
|  | 
 | ||
|  | - `second (0-59)` | ||
|  | - `minute (0-59)` | ||
|  | - `hour  (0-23)` | ||
|  | - `date  (1-31)` | ||
|  | - `month (0-11)` | ||
|  | - `year` | ||
|  | - `dayOfWeek (0-6) Starting with Sunday` | ||
|  | - `tz` | ||
|  | 
 | ||
|  | 
 | ||
|  | > **Note**: It's worth noting that the default value of a component of a recurrence rule is
 | ||
|  | > `null` (except for second, which is 0 for familiarity with cron). *If we did not
 | ||
|  | > explicitly set `minute` to 0 above, the message would have instead been logged at
 | ||
|  | > 5:00pm, 5:01pm, 5:02pm, ..., 5:59pm.* Probably not what you want.
 | ||
|  | 
 | ||
|  | #### Object Literal Syntax
 | ||
|  | 
 | ||
|  | To make things a little easier, an object literal syntax is also supported, like | ||
|  | in this example which will log a message every Sunday at 2:30pm: | ||
|  | 
 | ||
|  | ```js | ||
|  | const job = schedule.scheduleJob({hour: 14, minute: 30, dayOfWeek: 0}, function(){ | ||
|  |   console.log('Time for tea!'); | ||
|  | }); | ||
|  | ``` | ||
|  | 
 | ||
|  | #### Set StartTime and EndTime
 | ||
|  | 
 | ||
|  | It will run after 5 seconds and stop after 10 seconds in this example. | ||
|  | The ruledat supports the above. | ||
|  | 
 | ||
|  | ```js | ||
|  | const startTime = new Date(Date.now() + 5000); | ||
|  | const endTime = new Date(startTime.getTime() + 5000); | ||
|  | const job = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){ | ||
|  |   console.log('Time for tea!'); | ||
|  | }); | ||
|  | ``` | ||
|  | 
 | ||
|  | ### Graceful Shutdown.
 | ||
|  | You can shutdown jobs gracefully.   | ||
|  | `gracefulShutdown()` will cancel all jobs and return Promise.   | ||
|  | It will wait until all jobs are terminated.   | ||
|  | ```js | ||
|  | schedule.gracefulShutdown(); | ||
|  | ``` | ||
|  | 
 | ||
|  | You can also gracefully shutdown jobs when a system interrupt occurs. | ||
|  | ``` | ||
|  | process.on('SIGINT', function () {  | ||
|  |   schedule.gracefulShutdown() | ||
|  |   .then(() => process.exit(0)) | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | ### Handle Jobs and Job Invocations
 | ||
|  | 
 | ||
|  | There are some function to get information for a Job and to handle the Job and | ||
|  | Invocations. | ||
|  | 
 | ||
|  | 
 | ||
|  | #### job.cancel(reschedule)
 | ||
|  | You can invalidate any job with the `cancel()` method: | ||
|  | 
 | ||
|  | ```js | ||
|  | j.cancel(); | ||
|  | ``` | ||
|  | All planned invocations will be canceled. When you set the parameter ***reschedule*** | ||
|  | to true then the Job is newly scheduled afterwards. | ||
|  | 
 | ||
|  | #### job.cancelNext(reschedule)
 | ||
|  | This method invalidates the next planned invocation or the job. | ||
|  | When you set the parameter ***reschedule*** to true then the Job is newly scheduled | ||
|  | afterwards. | ||
|  | 
 | ||
|  | #### job.reschedule(spec)
 | ||
|  | This method cancels all pending invocation and registers the Job completely new again using the given specification. | ||
|  | Return true/false on success/failure. | ||
|  | 
 | ||
|  | #### job.nextInvocation()
 | ||
|  | This method returns a Date object for the planned next Invocation for this Job. If no invocation is planned the method returns null. | ||
|  | 
 | ||
|  | ## Contributing
 | ||
|  | 
 | ||
|  | This module was originally developed by [Matt Patenaude] who eventually passed over maintainer's mantle over to [Tejas Manohar].    | ||
|  | 
 | ||
|  | Currently it is being maintained by [Igor Savin] and [our amazing community]. | ||
|  | 
 | ||
|  | We'd love to get your contributions. Individuals making significant and valuable | ||
|  | contributions are given commit-access to the project to contribute as they see fit. | ||
|  | 
 | ||
|  | Before jumping in, check out our [Contributing] page guide! | ||
|  | 
 | ||
|  | ## Copyright and license
 | ||
|  | 
 | ||
|  | Copyright 2015 Matt Patenaude. | ||
|  | 
 | ||
|  | Licensed under the **[MIT License](https://github.com/node-schedule/node-schedule/blob/master/LICENSE)**. | ||
|  | 
 | ||
|  | 
 | ||
|  | [cron]: http://unixhelp.ed.ac.uk/CGI/man-cgi?crontab+5 | ||
|  | [Contributing]: https://github.com/node-schedule/node-schedule/blob/master/CONTRIBUTING.md | ||
|  | [Matt Patenaude]: https://github.com/mattpat | ||
|  | [Tejas Manohar]: http://tejas.io | ||
|  | [Igor Savin]: https://twitter.com/kibertoad | ||
|  | [our amazing community]: https://github.com/node-schedule/node-schedule/graphs/contributors | ||
|  | [cron-parser]: https://github.com/harrisiirak/cron-parser |