다른 간격으로 작업을 수행 할 수있는 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.