LoginSignup
21
22

More than 5 years have passed since last update.

pm2で管理しているNode.jsプロセスを、Node.jsからpm2を起動して管理する。

Last updated at Posted at 2014-12-23

※ 分かりにくいタイトルですがご了承ください。

はじめに

私はNode.jsのデーモン化のツールとして(なんとなく高機能という噂なので)pm2を利用してます。
pm2はプログラムから呼び出すことも出来るので今回はこの機能を利用して、pm2プロセスを定期的に再起動するスクリプトを組んでみます。
デフォルト機能でスケジューリングって無いのかな...?

参考: Using PM2 programmatically

チュートリアルにあるコード

pm2kick.js
var pm2 = require('pm2');

// Connect or launch PM2
pm2.connect(function(err) {

  // Start a script on the current folder
  pm2.start('test.js', { name: 'test' }, function(err, proc) {
    if (err) throw new Error('err');

    // Get all processes running
    pm2.list(function(err, process_list) {
      console.log(process_list);

      // Disconnect to PM2
      pm2.disconnect(function() { process.exit(0) });
    });
  });
})

これをpm2kick.jsとして実行すると

$ node pm2kick.js

test.jsがpm2起動されます。pm2 listコマンドで確認出来ると思います。

$ pm2 list
┌────────────────────┬────┬──────┬──────┬────────┬───────────┬────────┬─────────────┬──────────┐
│ App name           │ id │ mode │ PID  │ status │ restarted │ uptime │      memory │ watching │
├────────────────────┼────┼──────┼──────┼────────┼───────────┼────────┼─────────────┼──────────┤
│ test               │ 0  │ fork │ 6545 │ online │         1 │ 15s    │ 18.648 MB   │ disabled │

node-cronを利用してpm2を再起動させる

準備

pm2,time,cronをインストールします。

$ npm i --save pm2 time cron

コード

プロセスのリスタートはrestart();というメソッドを利用します。

今回は全てのプロセスを再起動させたいので第一引数にallを渡して
pm2.restart('all', callback);を利用します。

pm2restart.js
var pm2 = require('pm2');
var cronJob = require('cron').CronJob;
var cronTime = "0 0 6 * * *"; // 毎日朝6時に実行

//プロセスの状態を確認して終了させる
function showAndDone(){
  pm2.list(function(err, process_list) {
    console.log(process_list);
    // Disconnect to PM2
    pm2.disconnect(function(){
      process.exit(0);
    });
  });
}

//全て再起動
function restartAll(){
  pm2.restart('all', function(err, proc){
    showAndDone();
  });
}

var job = new cronJob({
  cronTime: cronTime,
  onTick: function(){ //指定時に実行したい関数
    console.log('onTick!', new Date()); //時間表示

    //pm2関連を実行
    pm2.connect(function(err) {
      restartAll();
    });

  },
  onComplete: function() { //ジョブの完了または停止時に実行する関数
    console.log('onComplete!');
  },
  start: false // コンストラクタを終する前にジョブを開始するかどうか
  // timeZone: "Japan/Tokyo" //タイムゾーン
});

job.start();

確認

先ほど作った pm2プロセス監視用のpm2restart.js自体もpm2プロセスとして登録します。 分かりにくいですね汗

$ pm2 start pm2restart.js

cronがちゃんと動いてくれれば指定時間がくればpm2restartも含めて全てのプロセスが再起動されます。

↓指定時間後↓

全てのプロセスが再起動されていることが分かります。

参考リンク

21
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
22