2016-06-15 81 views
1

让我们看到的现象第一,为什么产卵的NodeJS进程成为<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('close', (code) => { 
    console.log(`child process closed with code ${code}`); 
}); 

while(true){} 

运行该代码的NodeJS,什么都不显示,似乎被触发任何事件。

然后运行 ​​“PS -ef | grep的LS | GRPE -v grep的” 在另一外壳,结果是:

liyuanq+ 10995 10990 0 11:06 pts/3 00:00:00 [ls] <defunct> 

如果删除代码:

while(true){} 

节点过程退出,并触发开启数据事件。

的问题是,为什么不点关闭衍生的进程时,它实际上完成了它的任务,直到父节点处理退出。

我的环境:

OS:Debian的8.4 x86_64的

节点:V6.1.0

回答

2

非常有趣的现象,谢谢!

如果执行等待()的孩子一个专门的线程,这种情况就不会发生

如果有孩子退出之间的间隙和家长进行等待(),孩子会看到在这个差距内不存在。

在节点中,因为我们只有一个线程,并且正在执行无限循环,所以无法进入事件循环,拦截子出口并从任务列表中清除子进程号。

如果用长延迟的setTimeout取代你而真循环,该线程将获得免费的CPU,等待孩子从任务列表中清除它 - 我已经验证了。

希望这会有所帮助。

+0

我的上帝!解决了!谢谢! –