node.js で cron を使う方法 pm2 と node-cron

2014年7月11日更新 view: 345 view
photoBy: http://1.bp.blogspot.com/-H5FbCHFLwJs/TVc0nYZXs-I…

node.jsでcronを使うには?

http://www.matomater.com/16554/

でやってみたが、この方法だと node.js のプロセスが立ち上がりまくってサーバーが落ちてしまう。
ということでpm2とcron.jsを使ってモジュール化してみることにした。

考え方

  • node-cron で定期的に動くjsを作成
  • 上記を永久的に動かしたいのでpm2で永久化
  • さらにサーバー止まってrebootしても自動で立ち上がり永久化
  • 結果 指定した時間ごとに永久的にプログラムを動かせる

pm2ってなんぞや?

node-forever みたいに 永続的に指定したnode.jsを動かすことができる。
foreverよりも高機能且つ、サーバーをrebootした後にも自動で起動してくれる。

node-cronってなんぞや?

http://dev.classmethod.jp/server-side/cron/

ようは、node.jsをcronで動かせるって感じ。
ただ、centosについてるcronとは別物なので注意。

早速準備

cronと、timeをインストール

npm install cron time

で、coffeescript
main.coffee (main.js に変換)

cronJob = require("cron").CronJob

# 毎秒実行
#cronTime = "* * * * * *"

# 28分毎に実行
# 先頭は0にする。でないと28分毎に毎秒動くので注意。
cronTime = "00 */28 * * * *"

# 一度だけ実行したい場合、Dateオブジェクトで指定も可能
# var cronTime = new Date();
job = new cronJob(

#実行したい日時 or crontab書式
cronTime: cronTime

#指定時に実行したい関数
onTick: ->
    console.log "onTick!"
    return


#ジョブの完了または停止時に実行する関数
onComplete: ->
    console.log "onComplete!"
    return


# コンストラクタを終する前にジョブを開始するかどうか
start: false

#タイムゾーン
timeZone: "Asia/Tokyo"
)

#ジョブ開始
job.start()

#ジョブ停止
#job.stop();

Crontabの日時の設定は左から順に
秒数: 0-59
分: 0-59
時: 0-23
何日か: 1-31
何月か: 0-11
月の週: 0-6
を設定できcentosのcronとは設定方法が違うので注意すること。

実行してみる

28分後とにonTick!と表示されるはず。
デバッグの時は毎秒実行しても良いかも。

node main.js

結果

onTick!
スポンサードリンク

これだとコマンドライン抜けたら終了しちゃいますよね・・・

そこで登場 pm2

先ほどのmain.jsを永久的に動かします。

まずはインストール

npm install pm2@latest -g

サーバーをrebootしても自動再起動するように。

sudo pm2 startup centos

pm2に先ほどのスクリプトを登録

sudo pm2 start main.js

リブートしてみる

reboot
-----
pm2 list

これでまだ立ち上がっていたら成功。

プロセスを削除したい

pm2 delete all

プロセスを停止したい

pm2 stop all

プロセスを再開したい

pm2 restart all
スポンサードリンク

関連記事

関連カテゴリ