如果用nodejs做服务器,很多情况下,是需要自动重启功能的。
![4001805bebc7ecca6297af430c7571b6.png](https://i-blog.csdnimg.cn/blog_migrate/5041428d7c67229f278a09e04fda5a99.jpeg)
比如:
场景1、当文件被修改时自动重启服务器。
这里的文件,可能是服务器主程序,比如修改了程序,也可以是其它依赖文件等。
例程:
两个文件,server.js是服务器文件。test30.js,用于启动监测server.js,当server.js文件内容发生变化时,自动重启之。
server.js:
require("http").createServer(function(req,res){ res.end("test");}).listen(8000);
test30.js:
var fs = require("fs");var exec = require("child_process").exec;function watch(){ var child = exec("node server.js"); var watcher = fs.watch(__dirname + "/server.js",function(event){ console.log("file changed,reload"); child.kill(); watcher.close(); watch(); })}watch();
执行效果:
![3b55889454a3838ce5a4f98de1e94c64.png](https://i-blog.csdnimg.cn/blog_migrate/2c172ccf03ad62899e8cfa8d6e52655b.jpeg)
场景2、高稳定性需求,做为服务器程序的守护进程,当发现服务器意外终止时,重启之。
比如,ShareWAF(ShareWAF.com)就可以用守护进程启动,守护进程每10秒与ShareWAF主进程通信一次,万一发现ShareWAF没有回应,就重启它。
守护进程代码:
/* * ShareWAF 守护进程 * 功能:检测ShareWAF工作是否正常,如出现异常:无法访问,则对其进行重启 * 本程序可以用forever启动,防止本进程出异常退出,达到双重守护效果 */process.env.UV_THREADPOOL_SIZE = 128;const { exec } = require('child_process');/* * 启动ShareWAF */function start_sharewaf(){ exec('forever start sharewaf.js', (error, stdout, stderr) => { if (error) { console.error(`exec error: ${error}`); return; } console.log(`stdout: ${stdout}`); console.log(`stderr: ${stderr}`); });}/* * 关闭ShareWAF */function stop_sharewaf(){ exec('forever stop sharewaf.js', (error, stdout, stderr) => { if (error) { console.error(`exec error: ${error}`); return; } console.log(`stdout: ${stdout}`); console.log(`stderr: ${stderr}`); });}//启动ShareWAFstart_sharewaf();var request = require('request');//sharewaf地址和端口var sharewaf_host = "http://127.0.0.1:" + require('./config.js').shield_port + "/";console.log("sharewaf address:",sharewaf_host);//10秒检测一次sharewaf服务是否正常setInterval(function(){ //访问sharewaf request.get(sharewaf_host, {timeout: 5000}, function(err) { if (err != null){ if(err.code == 'ETIMEDOUT' || err.code =='ECONNREFUSED' || err.code=='ESOCKETTIMEDOUT'){ //重启sharewaf stop_sharewaf(); start_sharewaf(); }else{ console.log("Error:",err.code); } } }); }, 10000);
注:因为ShareWAF是WAF(Web应用防火墙),WAF是需要高稳定性的。
执行效果:
![46a360a41e4105747763c373ce453123.png](https://i-blog.csdnimg.cn/blog_migrate/ca1d05681f2d5343ab5e25db1f0ff72f.jpeg)
ShareWAF的高稳定性,除了用子进程监测方式,本身还使用了三方模块forever,
forever(https://www.npmjs.com/package/forever)也具有同本代码所示一样的效果,如果用forever启动的程序意外中止,也会被自动重启。
![668c8a6ba25fd240f6d5ac77db624a98.png](https://i-blog.csdnimg.cn/blog_migrate/774a86f62afa2b735e19c073c0c682f9.jpeg)
更多本系列文章:
Node.JS实战29:在浏览器端使用Node模块
Node.JS实战28:在Node中使用DOM
Node.JS实战27:同步执行的子进程
Node.JS实战26:强大的工作池。收藏吧!你一定会用的到
Node.JS实战25:重要!大运算量?用Fork、让子进程来做