다른 간격으로 작업을 수행 할 수있는 Nodejs 스케줄러가 필요합니다.


127

다른 간격으로 여러 작업을 예약 할 수있는 노드 작업 일정을 찾고 있습니다. 예를 들어

  • 30 초마다 통화 기능 A
  • 60 초마다 함수 B 호출
  • 7 일마다 함수 C 호출

또한 프로세스를 시작하고 중지 할 수 있기를 원합니다.

지금까지 나는 보았다 :

  • 나중에 -구문이 혼란 스럽습니다. 또한 한 달 이상 작업을 예약 할 수 없습니다.

  • 의제 -가장 유망한 것으로 보이지만 데이터베이스 기능에 대해 혼란 스럽습니다.

  • 타임 플랜 -너무 단순해서 시작 및 중지 할 수 없음

나는 후자의 구문이 혼란 스럽다는 것을 발견했다.


1
setInterval을 사용하는 것은 어떻습니까?
adeneo

예, 왜 setInterval을 사용하지 않습니까?
Yalamber

나는 이들 중 일부가 setInterval을 사용한다는 것을 알고 있지만 조금 더 높은 수준의 것을 찾고있었습니다 ... 파이썬에서 schedule ( github.com/dbader/schedule ) 을 사용 하고 노드를 찾고있었습니다.
그것에


나는 나쁘지 않은 안건을 사용했다
Aleksandr Golovatyi

답변:


223

나는 추천 할 것이다 node-cron. Cron 패턴을 사용하여 작업 을 실행할 수 있습니다.

'* * * * * *' - runs every second
'*/5 * * * * *' - runs every 5 seconds
'10,20,30 * * * * *' - run at 10th, 20th and 30th second of every minute
'0 * * * * *' - runs every minute
'0 0 * * * *' - runs every hour (at 0 minutes and 0 seconds)

그러나 더 복잡한 스케줄

'00 30 11 * * 1-5' - Runs every weekday (Monday through Friday) at 11:30:00 AM. It does not run on Saturday or Sunday.

샘플 코드 : 10 분마다 작업 실행 :

var cron = require('cron');
var cronJob = cron.job("0 */10 * * * *", function(){
    // perform operation e.g. GET request http.get() etc.
    console.info('cron job completed');
}); 
cronJob.start();

node-cron Wiki 에서 더 많은 예제를 찾을 수 있습니다

크론 구성에 대한 자세한 내용은 크론 위키 에서 찾을 수 있습니다.

많은 프로젝트에서 해당 라이브러리를 사용하고 있으며 작업을 수행합니다. 도움이 되길 바랍니다.


좋아, I는 크론 구문에 의해 협박, 그러나 이것은 가장 좋은 방법처럼 보인다되었다
user379468

1
내가 곧 말을 기다립니다. 5 초마다 또는 30 초마다 실행되는 cron을 어떻게 작성합니까?
user379468

3
cron 구문은 무섭게 보일 수 있습니다 . 반면에 그것은 오랫동안 존재하며 널리 알려져 있으므로 SO에 대한 많은 지원을받을 것입니다.
Tom

1
내 응답을 업데이트하여- '* / 5 * * * * *'-5 초마다 또는 '* / 30 * * * * *'초
Tom

1
2020 년 기준으로 node-cron 공식 npm 페이지에 따라이 패키지의 사용이 줄었습니다. 이 패키지는 2 년 전에 npm에 마지막으로 게시되었으므로 정기적으로 업데이트되지 않습니다. 이제는 이름이 같지만 다른 URL을 사용 하는 다른 패키지 노드 크론 이 선호됩니다.
n0noob

36

내가 사용했던 노드 크론의제를 .

node-cron 은 매우 간단한 라이브러리로 crontab과 같은 매우 기본적이고 이해하기 쉬운 API를 제공합니다. 구성이 필요하지 않으며 작동합니다.

var cronJob = require('cron').CronJob;
var myJob = new cronJob('00 30 11 * * 1-5', function(){...});
myJob.start();

의제 는 매우 강력하며 훨씬 복잡한 서비스에 적합합니다. ifttt 에 대해 생각하십시오 . 수백만 개의 작업을 실행해야합니다. 의제 가 최선의 선택이 될 것입니다.

참고 : 일정을 사용 하려면 Mongodb 가 필요합니다

var Agenda = require("Agenda");
var agenda = new Agenda({db: { address: 'localhost:27017/agenda-example'}});
agenda.every('*/3 * * * *', 'delete old users');
agenda.start();

1
어떤 이유로 Agenda를 사용하려고하면 ReferenceError : Agenda가 정의되지 않았습니다. NPM과 함께 패키지를 설치했습니다. 아젠다를 인스턴스화하기 전에 무엇을해야합니까?
user379468

2
나는 당신이 그것을 로컬 변수에 요구해야한다고 생각합니다. var Agenda = require ( "아젠다");
Ryan Wu

1
나는 최근에 의제, 프로젝트 설정 및 프로젝트 구조에 대한 블로그 코멘트 작성 goo.gl/5sCNBM
로빈 Wieruch

1
의제를 사용하려면 Mongodb를 실행해야합니다.
Mark Robson

1
node-cron 또는 agenda가 별도의 노드 시스템 프로세스를 생성합니까? 다중 노드 프로세스 설정에서 사용할 수 있습니까?
Prasad Silva

14

최고의 순위는

1. 노드 일정

2. 나중에

3. 크론 탭

노드 일정 샘플 은 다음과 같습니다.

var schedule = require("node-schedule");
var rule = new schedule.RecurrenceRule();
//rule.minute = 40;
rule.second = 10;
var jj = schedule.scheduleJob(rule, function(){
    console.log("execute jj");
});

노드 모듈 에서 답을 찾을 수 있습니다 .


1
구문을 사랑해 주셔서 감사합니다.
Overdrivr

10

선언적 인터페이스를 제공하는 모멘트 지속 시간을 사용하여 setInterval 주위에 래퍼를 제공하는 노드 모듈을 작성했습니다.

npm 매 순간 설치

var every = require('every-moment');

var timer = every(5, 'seconds', function() {
    console.log(this.duration);
});

every(2, 'weeks', function() {
    console.log(this.duration);
    timer.stop();
    this.set(1, 'week');
    this.start();
});

https://www.npmjs.com/package/every-moment

https://github.com/raygerrard/every-moment


4
github 링크가 끊어졌습니다 (404)
kekko12

이것은 많이 읽을 수 있습니다. node-cron@Tom 답변으로 사용되는 패키지를 작성했습니다 . 당신과 비슷한 좋은 구문이 있습니다. reel().call(() => console.log('hello !!')).everyMinute().run() github.com/shakee93/node-reel
shakee93

@ kekko12 NPM에 있습니다 : npmjs.com/package/every-moment
Ali Hesari


1

나는 timexe 라는 작은 모듈을 작성했습니다 .

  • 간단하고 작고 안정적인 코드이며 종속성이 없습니다.
  • 해상도는 밀리 초 단위이며 시간이 지남에 따라 높은 정밀도를 갖습니다.
  • Cron과 유사하지만 호환되지 않음 (역순 및 기타 개선)
  • 브라우저에서도 작동합니다

설치:

npm install timexe

사용하다:

var timexe = require('timexe');
//Every 30 sec
var res1=timexe(”* * * * * /30”, function() console.log(“Its time again”)});

//Every minute
var res2=timexe(”* * * * *”,function() console.log(“a minute has passed”)});

//Every 7 days
var res3=timexe(”* y/7”,function() console.log(“its the 7th day”)});

//Every Wednesdays 
var res3=timexe(”* * w3”,function() console.log(“its Wednesdays”)});

// Stop "every 30 sec. timer"
timexe.remove(res1.id);

timexe 작업 배열에서 직접 항목을 제거 / 다시 추가하여 시작 / 중지 기능을 수행 할 수 있습니다. 그러나 그것은 표현 기능이 아닙니다.


4
당신이 저자라는 것을 언급해야합니다.
a20

13
@ a20은 "그런 일을하기 위해 작은 모듈을 작성했습니다."는 읽는 동안 건너 뛰는 경우 작성자임을 나타냅니다.
PirateApp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.