Node.js程序守護,防止程式崩潰自動退出
阿新 • • 發佈:2018-12-23
最近用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();
}
});
現在這個只能保證子程序重啟,但是父程序如果掛了就完蛋了,所以你可以把上面的程式碼寫成,父程序自己掛了可以重啟自己。