背景:
项目以antDesign为主体实现,在线上运行时,偶发性的出现因为系统异常导致nodejs进程被kill掉的情况,又因为nodejs为单线程架构,一旦nodejs进程被kill,无法完成自动重启,又因为antDesign的实现底层是依赖与nodejs的,所以此处需要有一个方案,能够监听nodejs进程,并在进程意外结束时自动重启
思路:
1. 启动nodejs进程,这个进程在antDesign项目中,在通过npm start时会自动创建,所以如果希望能够重启,就需要在代码中调用执行npm start
2. 进程监听程序,该监听程序作为系统的主程序,启动antDesign的部分作为子程序,同时监控主、子程序的执行情况
3. 主程序也可能会遇到未捕获的异常,进而导致系统异常退出的情况,所以需要对主程序的未捕获异常进行处理
具体实现:
const fs = require('fs'); //获取子进程对象 const child_process = require('child_process'); //子进程重启 var cat = child_process.spawn('cat'); //调用运行的方法 run(); function run(){ console.log("into run"); //在主进程下,调用子进程,执行Linux命令,借助该命令启动antDesign项目 child_process.exec('npm start', function(error, stdout, stderr) { //根据error的结果,来判断是否执行成功 if(error == null) { console.log("服务器启动成功"); }else{ console.log("服务器启动失败"); } //执行完成后,启动监听程序 checkServerStatus(); }); } //监听方法 function checkServerStatus(){ console.log("into checkServerStatus"); //监控系统的nodejs进程 child_process.exec('pgrep nodejs', function(e, stdout, stderr) { if(e!=null) { console.log("服务器异常停止,正在重启"); console.log(e.message); //监听不到nodejs进程后,表示服务器已停止,所以此处调用run()方法完成进程重启 run(); }else{ console.log("服务器正常运行中"); } }); //每隔5秒监听一次 setTimeout("checkServerStatus()",5000); } //主程序未捕获异常的处理方式 process.on('uncaughtException', function (err) { console.log('Caught exception: ' + err); }); //child_process退出处理 cat.on('exit', function() { console.log('child_process退出了'); }); //child_process线程异常捕获处理 cat.on('uncaughtException', function(e) { console.log("child_process error==>:"+e); });
启动项目:
之前的启动方式是直接通过npm start完成,现在可以通过node xxx.js文件完成启动,xxx.js文件就是上段代码保存后的文件名 如:node NPMProcessGuard.js
目前刚刚接触这个antDesign,对node也不熟悉,百般摸索和baidu后才确定目前的处理方案,也有一个说法是针对nodejs程序的,说是可以使用pm2进行管理,但是我目前没有测试成功,后边继续。