Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

はじめに

私は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も含めて全てのプロセスが再起動されます。

↓指定時間後↓

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

参考リンク

n0bisuke
プロトタイピング専門スクール「プロトアウトスタジオ」で教えたりしてます。 プロフ -> https://dotstud.io/members/n0bisuke
https://protoout.studio
dotstudio
全ての人がモノづくりを楽しむ世界を目指して活動しています。
https://dotstud.io
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away