※ 分かりにくいタイトルですがご了承ください。
##はじめに
私はNode.jsのデーモン化のツールとして(なんとなく高機能という噂なので)pm2を利用してます。
pm2はプログラムから呼び出すことも出来るので今回はこの機能を利用して、pm2プロセスを定期的に再起動するスクリプトを組んでみます。
デフォルト機能でスケジューリングって無いのかな...?
参考: Using PM2 programmatically
###チュートリアルにあるコード
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);
を利用します。
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も含めて全てのプロセスが再起動されます。
↓指定時間後↓
全てのプロセスが再起動されていることが分かります。