linux定时任务nodejs,让Nodejs来管理定时任务later
從零開始nodejs系列文章,將介紹如何利Javascript做為服務端腳本,通過Nodejs框架web開發。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome瀏覽器就基于V8,同時打開20-30個網頁都很流暢。Nodejs標準的web開發框架Express,可以幫助我們迅速建立web站點,比起PHP的開發效率更高,而且學習曲線更低。非常適合小型網站,個性化網站,我們自己的Geek網站!!
關于作者
張丹(Conan), 程序員Java,R,PHP,Javascript
weibo:@Conan_Z
email: bsspirit@gmail.com
前言
一個完整的系統少不了定時任務,大多數情況我們都選用使用Linux
CRON,通過操作系統命令進行定時任務。當我們要維護多臺計算機,幾十個,幾百個定時任務的時候,用CRON會帶來非常大的運維成本。可能寫到程序中,就是一個不錯的選擇了。
Later提供了一個Nodejs的定時任務解決方案,讓我來看看他是怎么工作的吧!!
目錄
什么是定時任務?
Later介紹
Later安裝
Later基本使用
Later Schedules – 設置時間表
Later Time Periods – 時間定義和時間計算
Later Modifiers – 行為修飾符
Later Parsers – 規則解釋器
Later Occurrences – 時間控制
Later Executing – 啟動運行
1. 什么是定時任務?
定時任務(計劃任務),是任務在約定的時間執行已經計劃好的工作,這是表面的意思。在Linux中,我們經常用到 cron
服務器來完成這項工作。cron服務器可以根據配置文件約定的時間來執行特定的作務。比如我們可以在配置文件中約定每天早上4點,對httpd
服務器重新啟動,這就是一個計劃任務;
crontab文件的格式:M H D
m d cmd.
M: 分鐘(0-59)。
H:小時(0-23)。
D:天(1-31)。
m: 月(1-12)。
d: 一星期內的天(0~6,0為星期天)。
每兩個小時
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
晚上11點到早上8點之間每兩個小時,早上八點
0 23-7/2,8 * * * echo "Have a good dream:)" >> /tmp/test.txt
每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點
0 11 4 * 1-3 command line
1月1日早上4點
0 4 1 1 * command line
2. Later介紹
Later是一個基于Nodejs的工具庫,用最簡單的方式執行定時任務。Later可以運行在Node和瀏覽器中。
3. Later安裝
Later可以運行在Node和瀏覽器中,分別用npm和bower進行依賴管理。關于NPM的介紹,請參考:快速創建基于npm的nodejs庫,
關于Bower的介紹,請參考:bower解決js的依賴管理
系統環境
Linux: Ubuntu 12.04.2 LTS 64bit deskop
Nodejs: npm 1.2.21
node v0.11.2
安裝later
~ cd /home/conan/nodejs
~ mkdir nodejs-later && cd nodejs-later
~ sudo npm install later
npm http GET https://registry.npmjs.org/later
npm http 200 https://registry.npmjs.org/later
npm http GET https://registry.npmjs.org/later/-/later-1.1.6.tgz
npm http 200 https://registry.npmjs.org/later/-/later-1.1.6.tgz
later@1.1.6 node_modules/later
沒有其他包的依賴,這樣就安裝完成了!
4. Later基本使用
創建一個每5分鐘啟動的定時器規則,輸出啟動時間。
創建啟動文件:app.js
~ vi app.js
var later = require('later');
var sched = later.parse.text('every 5 mins'),
occurrences = later.schedule(sched).next(10);
for(var i=0;i<10;i++){
console.log(occurrences[i]);
}
運程程序:
~ node app.js
Thu Dec 26 2013 10:45:00 GMT+0800 (CST)
Thu Dec 26 2013 10:50:00 GMT+0800 (CST)
Thu Dec 26 2013 10:55:00 GMT+0800 (CST)
Thu Dec 26 2013 11:00:00 GMT+0800 (CST)
Thu Dec 26 2013 11:05:00 GMT+0800 (CST)
Thu Dec 26 2013 11:10:00 GMT+0800 (CST)
Thu Dec 26 2013 11:15:00 GMT+0800 (CST)
Thu Dec 26 2013 11:20:00 GMT+0800 (CST)
Thu Dec 26 2013 11:25:00 GMT+0800 (CST)
Thu Dec 26 2013 11:30:00 GMT+0800 (CST)
5. Later Schedules - 設置時間表
Schedules模塊用來設置定時規則,提供3種規則設置。
Basic schedules:基本時間表
Composite schedules: 組合時間表
Exception schedules: 異常時間表
1). Basic schedules:基本時間表
設置每日10:15am ,
10:45am啟動
var basic = {h: [10], m: [15,45]};
2). Composite schedules:
組合時間表
設置每日10:15am ,
10:45am, 和17:40pm 啟動
var composite = [
{h: [10], m: [15,45]},
{h: [17], m: [30]}
];
3). Exception schedules:
異常時間表
用于設置一下無效的日期:設置 每年1月
和 每周一,六,日 時間表無效
var exception = [
{M: [1]},
{dw: [1,6,7]}
];
4). 程序實現
新建測試文件:schedules.js
~ vi schedules.js
var later = require('later');
var basic = {h: [10], m: [15,45]};
var composite = [
basic,
{h: [17], m: [30]}
];
var exception = [
{M: [1]},
{dw: [1,6,7]}
];
var sched = {
schedules:composite,
exceptions:exception
};
later.date.localTime();
console.log("Now:"+new Date());
var occurrences = later.schedule(sched).next(10);
for(var i = 0; i < occurrences.length; i++) {
console.log(occurrences[i]);
}
運行程序
~ node schedules.js
Now:Thu Dec 26 2013 11:40:27 GMT+0800 (CST)
Thu Dec 26 2013 17:30:00 GMT+0800 (CST)
Mon Dec 30 2013 10:15:00 GMT+0800 (CST)
Mon Dec 30 2013 10:45:00 GMT+0800 (CST)
Mon Dec 30 2013 17:30:00 GMT+0800 (CST)
Tue Dec 31 2013 10:15:00 GMT+0800 (CST)
Tue Dec 31 2013 10:45:00 GMT+0800 (CST)
Tue Dec 31 2013 17:30:00 GMT+0800 (CST)
Mon Feb 03 2014 10:15:00 GMT+0800 (CST)
Mon Feb 03 2014 10:45:00 GMT+0800 (CST)
Mon Feb 03 2014 17:30:00 GMT+0800 (CST)
當前時間為:2013-12-26
11:40:27
從結果中看到,接下來的10個時間點。
第1個:2013-12-26 17:30:00
第2個:2013-12-30 10:15:00 (排除了2013-12-27,28,29的3天)
第8個:2014-02-01 10:15:00 (排除了2014的1月份)
還有比這種方式,更便捷定義時間表的么!!太神奇了!
6. Later Time Periods - 時間定義和時間計算
Time
Periods模塊用于時間定義和時間計算。
1). 時間定義
在之前的代碼中,我們是這樣的定義的
{h: [17], m: [30]}
h代表小時,m代表分鐘。
時間定義完整列表:
Second, s: 秒, 取值范圍:[0-59]
minute, m:分, 取值范圍:[0-59]
hour, h: 時, 取值范圍:[0-23]
time, t: 秒每日, 取值范圍:[0-86399]
day, D: 日, 取值范圍:[1-31]
dayOfWeek, dw, d: 日每周, 取值范圍:[1-7]
dayOfYear, dy: 日每年,取值范圍:[1-365]
weekOfMonth, wm: 周每月,取值范圍:[1-5]
weekOfYear, wy: 周每年,取值范圍:[1-52]
month, M: 月,取值范圍:[1-12]
year, Y: 年,取值范圍:[1970-2099]
2). 時間計算
name: 名稱
range: 取值范圍計數
val(date): 當前時間段的值
isValid(date, value): 檢驗輸入是否是當前時間段的值
extent(date): 取值范圍
start(date): 開始時間點
end(date): 結束時間點
next(date, value): value之后的時間點
prev(date, value): value之前的時間點
3). 程序實現
新建測試文件:time.js
~ vi time.js
var later = require('later');
later.date.localTime();
var d = new Date();
console.log(d);
console.log(later.hour.name);
console.log(later.hour.range);
console.log(later.hour.val(d));
console.log(later.hour.isValid(d, 2));
console.log(later.hour.isValid(d, 12));
console.log(later.hour.extent());
console.log(later.hour.start(d));
console.log(later.hour.end(d));
console.log(later.hour.next(d, 5));
console.log(later.hour.prev(d, 21));
運行程序
~ node time.js
Thu Dec 26 2013 12:30:42 GMT+0800 (CST)
hour
3600
12
false
true
[ 0, 23 ]
Thu Dec 26 2013 12:00:00 GMT+0800 (CST)
Thu Dec 26 2013 12:59:59 GMT+0800 (CST)
Fri Dec 27 2013 05:00:00 GMT+0800 (CST)
Wed Dec 25 2013 21:59:59 GMT+0800 (CST)
輸出結果的解釋:
當前時間:2013-12-26 12:30:42
以小時定義時間
每小時3600個計數點
當前時間段的的值是12
檢查2不是當前時間段的值
檢查12不是當前時間段的值
取值范圍[0,23]
當前時間段的開始時間點:12:00:00
當前時間段的結束時間點:12:59:59
下一個周期第5個時間段開始點:2013-12-27 05:00:00
上一個周期第21個時間段結束點:2013-12-25 21:59:59
7. Later Modifiers - 行為修飾符
Later可以編寫自定義修飾符,可以改變現有的時間周期的行為,通過 _(modifier-id) 這樣的格式定義。
after(_a): 之后時間修飾符
before(_b): 之前時間修飾符
1). after(_a)
以小時定義,設置17:00pm之前都是合法的時間
var demo1_a = {schedules: [{h_a: [17]}]};
#等價定義
var demo1 = {schedules: [{h: [17,18,19,20,21,22,23]}]};
2). before(_b)
以小時定義,設置17:00pm之后都是合法的時間
var demo2_b = {schedules: [{h_b: [17]}]};
#等價定義
var demo2 = {schedules: [{h: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]}]};
3). 程序實現
新建文件:modifiers.js
~ vi modifiers.js
var later = require('later');
later.date.localTime();
console.log("Now:"+new Date());
var demo1_a = {schedules: [{h_a: [17]}]};
var demo2_b = {schedules: [{h_b: [17]}]};
var occurrences = later.schedule(demo1_a).next(3);
for(var i = 0; i < occurrences.length; i++) {
console.log(occurrences[i]);
}
occurrences = later.schedule(demo2_b).next(3);
for(var i = 0; i < occurrences.length; i++) {
console.log(occurrences[i]);
}
運行程序
~ node modifiers.js
Now:Thu Dec 26 2013 13:04:06 GMT+0800 (CST)
Thu Dec 26 2013 17:00:00 GMT+0800 (CST)
Thu Dec 26 2013 18:00:00 GMT+0800 (CST)
Thu Dec 26 2013 19:00:00 GMT+0800 (CST)
Thu Dec 26 2013 13:04:06 GMT+0800 (CST)
Thu Dec 26 2013 14:00:00 GMT+0800 (CST)
Thu Dec 26 2013 15:00:00 GMT+0800 (CST)
當前時間:2013-12-26
13:04:06
17點后的時間表(h_a):17:00:00
17點前的時間表(h_b):13:04:06
Later支持我們可以定義自己的修飾符,有興趣的同學自己查文檔吧。
8. Later Parsers - 規則解釋器
Parsers模塊提供了3種規則解釋器,方便定義時間表。
Recur: 鏈式API定義
Cron Parser: CRON格式定義
Text Parser:自然語言定義
1). Recur: 鏈式API定義
設置每小時第5分0秒啟動
var sched = later.parse.recur().on(5).minute();
時間定義API
second();
minute();
hour();
time();
dayOfWeek();
dayOfWeekCount();
dayOfMonth();
dayOfYear();
weekOfMonth();
weekOfYear();
month();
year();
時間計算API
on(vals): 設置時間值
first(): 最小的時間值
last(): 最大的時間值
onWeekend(): 周末,等價于on(1,7).dayOfWeek()
onWeekday(): 工作日,等價于on(2,3,4,5,6).dayOfWeek()
every(val): 循環每個時間
after(val): 在之后
before(val): 在之前
startingOn(val): 每個時間段開始的偏移量
between(start, end): 在兩個時間之間
and():
except():
customPeriod(id):
customModifier(id, vals):
2). Cron Parser: CRON格式定義
通過原CRON格式進行定義。
設置每小時第5分0秒啟動
var cron = later.parse.cron('5 * * * *');
3). Text Parser:自然語言定義
通過關鍵字格式進行定義。
var text = later.parse.text('every 5th mins');
9. Later Occurrences - 時間控制
時區設置
//默認UTF時區
later.date.UTC();
//設置本地時區
later.date.localTime();
構造對象
var schedule = {schedules: [{m: [5]}]};
var occurrences = later.schedule(schedule);
時間控制API
later.schedule(schedule).next(count, start, end): 取下N個有效時間點
later.schedule(schedule).prev(count, start, end): 取上N個有效時間點
later.schedule(schedule).nextRange(count, start, end):
取下N個有效時間段
later.schedule(schedule).prevRange(count, start, end):
取上N個有效時間段
10. Later Executing - 啟動運行
Executing模塊定義了setTimeout和setInterval兩種方式,實現運行。
setTimeout: 設置一段時間后運行,只運行1次
setInterval: 循環運行,直到clear
1). setTimeout
定義:5秒后運行,只運行一次!
新建文件:settimeout.js
~ vi settimeout.js
var later = require('later');
later.date.localTime();
console.log("Now:"+new Date());
var sched = later.parse.recur().every(5).second(),
t = later.setTimeout(function() {
test(5);
}, sched);
function test(val) {
console.log(new Date());
console.log(val);
}
運行程序
~ node settimeout.js
Now:Thu Dec 26 2013 14:12:36 GMT+0800 (CST)
Thu Dec 26 2013 14:12:40 GMT+0800 (CST)
5
2). setInterval
定義:2秒后運行,循環運行,直到15秒后,clear停止!
新建文件:setinterval.js
~ vi setInterval.js
var later = require('later');
later.date.localTime();
console.log("Now:"+new Date());
var sched = later.parse.recur().every(2).second(),
t = later.setInterval(function() {
test(Math.random(10));
}, sched);
function test(val) {
console.log(new Date());
console.log(val);
}
setTimeout(function(){
t.clear();
console.log("Clear");
},15*1000);
運行程序
~ node setinterval.js
Now:Thu Dec 26 2013 14:17:54 GMT+0800 (CST)
Thu Dec 26 2013 14:17:56 GMT+0800 (CST)
0.5084630874916911
Thu Dec 26 2013 14:17:58 GMT+0800 (CST)
0.47506075259298086
Thu Dec 26 2013 14:18:00 GMT+0800 (CST)
0.957129133399576
Thu Dec 26 2013 14:18:02 GMT+0800 (CST)
0.7480122991837561
Thu Dec 26 2013 14:18:04 GMT+0800 (CST)
0.9212428922764957
Thu Dec 26 2013 14:18:06 GMT+0800 (CST)
0.030472515616565943
Thu Dec 26 2013 14:18:08 GMT+0800 (CST)
0.9528024469036609
Clear
總結
以上是生活随笔為你收集整理的linux定时任务nodejs,让Nodejs来管理定时任务later的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis命令之set和zset的操作
- 下一篇: 蚊子132 主要负责 FreeEIM 的