为什么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代码,没有任何显示,似乎没有事件被触发。

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

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

如果删除代码:

 while(true){} 

节点进程退出,并触发on数据事件。

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

我的环境:

操作系统:Debian 8.4 x86_64

节点:v6.1.0

非常有趣的观察,谢谢!

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

如果孩子出口和父母之间有差距(),孩子将被视为在这个差距内已经不存在。

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

如果你用长时间的setTimeout代替while-true循环,那么线程将获得空闲的CPU,等待subprocess,并从任务列表中清除它 – 我已经validation了这一点。

希望这可以帮助。

Interesting Posts