1. 程式人生 > >Node.js程序守護,防止程式崩潰自動退出

Node.js程序守護,防止程式崩潰自動退出

最近用node在寫一個TCP Socket伺服器,但是客戶端異常斷開後,伺服器會報錯[Error: read ECONNRESET]錯誤,然後掛掉,上網查了相關文章,沒有好的方法,最好的就是對伺服器程式進行程序監控,如果程式退出,監控程式再重新啟動伺服器程式,進而防止伺服器崩掉。下面是實現過程:

網上查了下,有forever和pm2等元件,安裝了forever元件,進行了測試,可以正常守護程序,但是每個如果拷貝到其他機器上也需要安裝forever元件,如果不能上網就更麻煩,繼續尋找其他解決方法…

這次的主角是 child_process.fork(modulePath, [args], [options])

fork函式可以直接執行的node模組,是spawn函式的封裝,與spawn函式不同的是,fork之後的子程序與父程序之間會建立IPC管道,用於程序之間的通訊,並返回子程序的例項,該例項擁有node程序所有屬性與方法。child_process.fork(‘./helloWork.js’); 與 child_process.spawn(‘node’,[‘./helloWork.js’]) 很相似,不同的就是fork建立了IPC管道。

守護程序要做的事兒,就是啟動被守護程序,並監聽其執行狀態,在被守護程序關閉後再次啟動,同時,守護程序退出時自動殺掉全部的子程序。

針對以上需求,思路應該是:

->啟動守護程序

->依次啟動各個子程序,並將返回的object程序例項存下來

->監聽子程序的exit事件

->觸發子程序exit事件後再次啟動子程序

->監聽守護程序exit事件,退出時殺死所有子程序

根據該思路,給出我實現的原始碼:

/**
 * Created by zzl on 2017/1/8.
 */
var fork = require('child_process').fork;

//儲存被子程序例項陣列
var workers = [];
//這裡的被子程序理論上可以無限多
var appsPath = ['./app.js'];
var createWorker = function
(appPath){
//儲存fork返回的程序例項 var worker = fork(appPath); //監聽子程序exit事件 worker.on('exit',function(){ console.log('worker:' + worker.pid + 'exited'); delete workers[worker.pid]; createWorker(appPath); }); workers[worker.pid] = worker; console.log('Create worker:' + worker.pid); }; //啟動所有子程序 for (var i = appsPath.length - 1; i >= 0; i--) { createWorker(appsPath[i]); } //父程序退出時殺死所有子程序 process.on('exit',function(){ for(var pid in workers){ workers[pid].kill(); } });

現在這個只能保證子程序重啟,但是父程序如果掛了就完蛋了,所以你可以把上面的程式碼寫成,父程序自己掛了可以重啟自己。