为什么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了这一点。
希望这可以帮助。