为什么节点子进程从父进程分离并开始独立运行



我有一个节点子派生进程,它在收到的每个"数据事件"上都使用写流不断地写入文件。该脚本在ssh下运行,并面临边缘情况问题。

考虑使用同一ssh主机打开多个终端,脚本开始在一个终端中运行。有人在执行ssh终端时不小心关闭了它,不想停止子进程的执行。当使用命令ps-ef|grep"命令名"时,子进程仍使用不同的父进程id运行(显示为1(,但子进程中的写流停止写入文件。似乎子进程变成了僵尸进程,尽管我将进程与父进程分离。你可以在下面找到脚本:

var execSpawn = require('child_process').spawn;
var Promise = require('bluebird');
var spawnAction = function(path, cmd, cb){
return function(resolve, reject, onCancel){
cmdExec = execSpawn(path, cmd, {detached: true});
//cmdExec = execSpawn(path, cmd, {detached: true}).unref();
var fileData = {}
var count = 0;
var stream = fs.createWriteStream('filepath');
cmdExec.stdout.setEncoding('utf8');
cmdExec.stdout.on('data', function(data){
//Certain actions with filedata and count;
stream.write(data);
});
cmdExec.stderr.on('data', function(data){
//some actions
stream.write("error");
});
cmdExec.on('close', function(){
stream.end();
if(cb){
resolve(cb(fileData));
}else{
resolve(count);
}
});
}
}

当允许此脚本在没有任何中断的情况下完全运行时,它正在正常运行。当脚本执行终端关闭子进程时,停止对文件的写流。如果我尝试使用detach和unref((,它会抛出一个错误,就像它无法计算出子进程上的事件stdout.on一样。

Cannot read property 'stdout' of undefined  

脚本运行期间的详细信息。这是在不同终端中的同一主机中拍摄的

ps -ef | grep command_name
root     19904 19191  0 20:16 ?        00:00:00 cli command_name pfitzner7 /dev/sdb
root     19905 19191  0 20:16 ?        00:00:00 cli command_name pfitzner7 /dev/sdc
root     19906 19191  0 20:16 ?        00:00:00 cli command_name pfitzner7 /dev/sdd
root     19907 19191  0 20:16 ?        00:00:00 cli command_name pfitzner7 /dev/sde
root     23101 13105  0 20:16 pts/0    00:00:00 grep --color=auto command_name

在脚本结束前关闭运行终端。我得到了这个:

ps -ef | grep command_name
root     19904     1  0 20:16 ?        00:00:00 cli command_name pfitzner7 /dev/sdb
root     19905     1  0 20:16 ?        00:00:00 cli command_name pfitzner7 /dev/sdc
root     19906     1  0 20:16 ?        00:00:00 cli command_name pfitzner7 /dev/sdd
root     19907     1  0 20:16 ?        00:00:00 cli command_name pfitzner7 /dev/sde
root     23163 13105  0 20:16 pts/0    00:00:00 grep --color=auto command_name

我正试图弄清楚为什么会出现这种问题,会有任何可能的方法以不同的方式来做吗。为什么父进程id更改为1,即使它是分离的子进程?子派生进程如何独立于父进程运行?

请告诉我你对这种方法的建议或错误的原因。

提前谢谢。

我认为,您不需要分离您的孩子。子级是异步派生的,因此您可以同时使用几个子级的stdio操作

最新更新