繁体   English   中英

为什么节点子生成程序与父进程分离并开始独立运行?

[英]Why the node child spawn process detached from parent process and start running independently ?

我有一个节点子生成程序,该进程在收到的每个“数据事件”上使用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? 子生成进程如何独立于父进程运行?

请让我知道您对这种方法的建议或错误的原因。

提前致谢。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM