さまざまな間隔でタスクを実行できるNodejsスケジューラが必要です[終了]


127

さまざまな間隔でいくつかのタスクをスケジュールできるノードジョブスケジュールを探しています。例えば、

  • 30秒ごとに関数Aを呼び出す
  • 60秒ごとに関数Bを呼び出す
  • 7日ごとに関数Cを呼び出す

また、プロセスを開始および停止できるようにしたいと考えています。

これまでのところ、私は見てきた:

  • 後で -構文が私を混乱させます、またどうやらあなたは一ヶ月を超えてタスクをスケジュールすることはできません

  • 議題 -最も有望なようですが、データベースの機能について混乱しています

  • タイムプラン -単純すぎる、開始および停止できない

後者の構文は混乱します。


1
ちょうどsetIntervalを使用するのはどうですか、まさにあなたが求めているもののように聞こえますか?
adeneo

はい、なぜsetIntervalを使用しないのですか?
Yalamber 2013

私は内部でこれらの一部がsetIntervalを使用していることを知っていますが、もう少し高いレベルを探していました... Pythonでスケジュール(github.com/dbader/schedule)を使用していて、ノードを探していましたそれに類似
user379468

TaskTimerを試してみてください- github.com/onury/tasktimer
オヌルユルドゥルム

私は議題を使用しましたが、悪くはありません
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 で他の例を見つけることができます

cron構成の詳細については、cron wikiをご覧ください。

私は多くのプロジェクトでそのライブラリを使用してきました。お役に立てば幸いです。



1
5秒ごとまたは30秒ごとに実行されるcronをどのように作成しますか?
user379468 2013

3
cron構文は恐ろしく見えるかもしれません。一方、それは長い間存在し、広く知られているため、SOで多くのサポートが得られます
Tom

1
'* / 5 * * * * *'-5秒ごとまたは '* / 30 * * * * *'秒
Tom

1
2020年以降、node-cronの公式npmページに従って、このパッケージの使用は減少しています。このパッケージは2年前にnpmで最後に公開されたため、定期的に更新されていません。ここで、明らかに同じ名前を持っているが別のURLを経由する、別のパッケージnode-cronをお勧めします。
n0noob

36

node-cronagendaを使用しました。

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
何らかの理由で、アジェンダを使用しようとすると、エラーReferenceError:Agenda is not definedが表示されます。NPMでパッケージをインストールしましたが、アジェンダをインスタンス化する前に何かする必要がありますか?
user379468 2013

2
あなたはあなたのローカル変数にそれを要求する必要があると思います。var Agenda = require( "Agenda");
Ryan Wu

1
私は最近、議題、プロジェクトのセットアップ、プロジェクト構造についてのブログのコメントを書きました。goo.gl/ 5sCNBM
Robin Wieruch

1
アジェンダを使用するにはMongodbを実行する必要があることに注意してください
マークロブソン

1
node-cronまたは議題は個別のノードシステムプロセスを生成しますか?それらをマルチノードプロセスセットアップで使用できますか?
Prasad Silva

14

最高のランキングは

1.node-schedule

2.後で

3.crontab

node-scheduleのサンプルは以下のとおりです。

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 install every-moment

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 Hesa​​ri


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 2015年

13
@ a20「それを行うための小さなモジュールを作成しました。」とは、読みながらスキップした場合に備えて彼が作者であることを意味します
PirateApp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.