Node.js 为什么nodejs生成过程成为<;不复存在>;直到父母离开

Node.js 为什么nodejs生成过程成为<;不复存在>;直到父母离开,node.js,spawn,zombie-process,defunct,Node.js,Spawn,Zombie Process,Defunct,我们先来看看这个现象 Nodejs代码: const cp = require('child_process'); var ls = cp.spawn('ls', ['/']); ls.stdout.on('data', (data) => { console.log(`stdout: ${data}`); }); ls.stderr.on('data', (data) => { console.log(`stderr: ${data}`); }); ls.on('c

我们先来看看这个现象

Nodejs代码:

const cp = require('child_process');

var ls = cp.spawn('ls', ['/']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.log(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process closed with code ${code}`);
});

while(true){}
运行此nodejs代码,未显示任何内容,似乎未触发任何事件

然后在另一个shell中运行“ps-ef | grep ls | grpe-v grep”,结果是:

liyuanq+ 10995 10990  0 11:06 pts/3    00:00:00 [ls] <defunct>
节点进程退出,并触发on data事件

问题是,为什么节点在父节点进程退出之前,在实际完成其作业时不关闭生成的进程

我的环境:

操作系统:Debian 8.4 x86_64


Node:v6.1.0

非常有趣的观察,谢谢

如果有一个专用线程对子线程执行wait(),则不会发生这种情况

如果子出口之间存在间隙,并且父出口执行wait(),则子出口将被视为在该间隙内失效

在节点中,由于我们只有一个线程,并且它正在执行无限循环,因此它无法进入事件循环、截获子出口并从任务列表中清除子ID

如果将while true循环替换为具有长延迟的setTimeout,线程将获得空闲CPU,等待子线程并将其从任务列表中清除—我已经验证了这一点


希望这能有所帮助。

我的上帝!解决了的!非常感谢。
while(true){}