我有一个节点子生成进程,该进程在收到的每个“数据事件”上都使用writestream连续写入文件中。该脚本在ssh下运行,并且遇到边缘情况问题。
考虑使用同一ssh主机打开多个终端,并且该脚本开始在一个终端中运行。有人在执行过程中意外关闭了ssh终端,并且不想停止子进程的执行。使用命令ps -ef时grep“命令名”子进程仍使用不同的父进程ID运行(显示1),但子进程中的writestream停止写入文件。尽管我从父进程中分离了进程,但子进程似乎变成了僵尸进程。您可以在下面找到脚本:
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);
}
});
}
}
当该脚本可以完全不受干扰地完全运行时,它可以正常运行。当脚本执行终端关闭子进程时,停止对文件的写流。如果我尝试与unref()一起使用detach,它将抛出一个错误,就像无法在子进程上弄清楚事件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?子生成进程如何独立于父进程运行?
请让我知道您对这种方法的建议或错误原因。
先谢谢了。