javascript代码实例教程-关于node.js的进程管理

发布时间:2019-01-22 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了javascript代码实例教程-关于node.js的进程管理脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。 如果是单纯的运行一个node进程,那会比较简单,例如:

 

node ./example.js

但是一般来说,当我们运行一个node进程之后,我们可能希望对这个进程进行更多的管理,例如,当node程序是一个server服务时,我们就有更多的需求。

 

例如:

 

1.服务挂掉的时候自动重启。

 

2.列出所有服务,包括服务的信息。

 

3.能够重启/终止某个服务。

 

4.为服务的运行记录日志

 

 

 

1.服务挂掉的时候自动重启。

 

对于这个需求,我们需要做的是把服务进程当做一个子进程来运行,当子进程不幸挂了,父进程将其重启,例如:

 

复制代码

VAR spawn = require('child_PRocess').spawn;

var cp = spawn(process.execPath,['./example.js']);

 

cp.on('exIT',function(){

    //restart

});

复制代码

假设父进程程序名为pro_a,那么通过父进程启动一个子程序会是这样:

 

pro_a ./example.js

传入子程序名,由父程序执行。

 

 

 

这样相当于pro_a程序管理子程序的执行:

 

 

 

 

 

2.列出所有服务,包括服务的信息。

 

假设我们执行example.js之后,还有多个程序需要执行,每个程序都使用pro_a程序来启动:

 

pro_a ./example.js

pro_a ./server.js

pro_a ./other.js

 

 

情况变成这样:

 

 

 

 

 

 

 

如上图,多个pro_a进程对应开启的多个不同子程序的进程。

 

这时候问题来了,我们希望知道所有用pro_a启动的子进程的进程信息,要怎么做呢?

 

例如:

 

pro_a -l //列出所有子进程信息

 

 

这时候需求就转变成:新的pro_a进程需要和其他pro_a进程通信,并获取其他pro_a进程运行的子进程的信息。

 

 

 

对于UNIX的跨进程通信,有几种方式,由于这里不同进程在同一个机器中,因此我们这里采用UNIX domain socket的方式(不用经过网卡),让在不同pro_a进程间进行通信。

 

使用这种方式,我们需要做的是pro_a进程每次创建子进程的时候,启用一个server,并监听对应的sock文件,那么当心的pro_a进程启动之后,就可以通过遍历所有sock文件并对有效sock文件进行连接,从而能够和不同pro_a进程之间进行消息的通信。

 

 

 

例如:

 

创建子进程的pro_a:

 

复制代码

var net = require('net');    

//使用UNIX domain socket

var server = net.createServer(function(socket){    

    socket.setEncoding('UTF8');

    socket.on('data',function(){

        //收到消息后,向请求方发送子进程相关信息

        socket.write(JSON.stringify({

            pid:child_process.pid

            //...

        }));

    });

 

});

 

server.listen(socketPath + 'resume_' + Date.now() + '.sock');       

复制代码

 

 

这样每个pro_a进程创建子进程之后,都会对应产生一个sock文件:

 

 

 

 

 

 

 

对于新的pro_a进程,第一步是获取所有sock文件,并进行连接:

 

复制代码

var getAllSocketFiles = function(){

    var socketFiles;

    try{

        socketFiles = fs.readdirSync(socketPath);

    }

    catch(ex){

        if(ex.code == 'ENOENT'){

            fs.mkdirSync(socketPath);

        }

 

        socketFiles = fs.readdirSync(socketPath);

    }

    return socketFiles;

};

复制代码

 

 

针对每个sock文件,创建socket进行连接,并发送消息请求:

 

复制代码

var socket = new net.Socket();

socket.setEncoding('UTF8');

 

socket.connect(this.socketName,function(){

    socket.write(JSON.stringify({

        //请求对应的子进程信息

    }))

});

 

socket.on('data',function(){

    data = JSON.parse(data);

    //获得对应子进程信息

});

复制代码

 

 

 

 

 

 

这样pro_a进程就能从其他pro_进程中获取到信息。

 

 

 

3.能够重启/终止某个服务。

 

由于我们设置了子程序在挂掉后会自动重启,因此我们需要增加一个命令让程序在需要时能正常关闭,例如:

 

pro_a -s 1140 //强制终止掉进程号为1140的子进程

 

 

此时该pro_a进程需要连接所有其他pro_a进程并获取他们的子进程信息(就像上面-l那样),然后筛选出pid未1140的子进程,再次通过socket发送关闭指令,对应的server接收到关闭指令后把其子进程kill掉。

 

 

 

 

 

4.为服务的运行记录日志。

 

这个只需要pro_a监听子进程的事件,并实时写入LOG文件就ok了。并且我们可以通过命令让心的pro_a进程能够查看某个其他pro_a进程中子进程的log,例如:

 

pro_a -L 1130 // 查看1130的子进程的log

 

 

原理和3相似,获取所有pro_a进程信息,筛选出pid为1130的子进程,socket发送获取log的指令,对应server把log信息返回。

觉得可用,就经常来吧! 脚本宝典 欢迎评论哦! js脚本,巧夺天工,精雕玉琢。小宝典献丑了!

脚本宝典总结

以上是脚本宝典为你收集整理的javascript代码实例教程-关于node.js的进程管理全部内容,希望文章能够帮你解决javascript代码实例教程-关于node.js的进程管理所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。