关于node.js的进程管理

21 篇文章 0 订阅
如果是单纯的运行一个node进程,那会比较简单,例如:
node./example.js
但是一般来说,当我们运行一个node进程之后,我们可能希望对这个进程进行更多的管理,例如,当node程序是一个server服务时,我们就有更多的需求。
例如:
1.服务挂掉的时候自动重启。
2.列出所有服务,包括服务的信息。
3.能够重启/终止某个服务。
4.为服务的运行记录日志。
1.服务挂掉的时候自动重启。
对于这个需求,我们需要做的是把服务进程当做一个子进程来运行,当子进程不幸挂了,父进程将其重启,例如:
复制代码
varspawn=require('child_process').spawn;
varcp=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的跨进程通信,有几种方式,由于这里不同进程在同一个机器中,因此我们这里采用UNIXdomainsocket的方式(不用经过网卡),让在不同pro_a进程间进行通信。
使用这种方式,我们需要做的是pro_a进程每次创建子进程的时候,启用一个server,并监听对应的sock文件,那么当心的pro_a进程启动之后,就可以通过遍历所有sock文件并对有效sock文件进行连接,从而能够和不同pro_a进程之间进行消息的通信。
例如:
创建子进程的pro_a:
复制代码
varnet=require('net');
//使用UNIXdomainsocket
varserver=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文件,并进行连接:
复制代码
vargetAllSocketFiles=function(){
varsocketFiles;
try{
socketFiles=fs.readdirSync(socketPath);
}
catch(ex){
if(ex.code=='ENOENT'){
fs.mkdirSync(socketPath);
}
socketFiles=fs.readdirSync(socketPath);
}
returnsocketFiles;
};
复制代码
针对每个sock文件,创建socket进行连接,并发送消息请求:
复制代码
varsocket=newnet.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-s1140//强制终止掉进程号为1140的子进程
此时该pro_a进程需要连接所有其他pro_a进程并获取他们的子进程信息(就像上面-l那样),然后筛选出pid未1140的子进程,再次通过socket发送关闭指令,对应的server接收到关闭指令后把其子进程kill掉。
4.为服务的运行记录日志。
这个只需要pro_a监听子进程的事件,并实时写入log文件就ok了。并且我们可以通过命令让心的pro_a进程能够查看某个其他pro_a进程中子进程的log,例如:
pro_a-L1130//查看1130的子进程的log
原理和3相似,获取所有pro_a进程信息,筛选出pid为1130的子进程,socket发送获取log的指令,对应server把log信息返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值