我们先来看一下现象
Node.js代码:
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数据事件。
问题在于,为什么节点在父节点进程退出之前实际完成其工作时才关闭它。
我的环境:
操作系统:Debian 8.4 x86_64
节点:v6.1.0
最佳答案
非常有趣的观察,谢谢!
如果有一个专用线程在子代上执行wait(),则不会发生这种情况
如果子级出口之间存在间隙,并且父级执行wait(),则该子级将被视为已失效。
在节点中,由于我们只有一个线程,并且它正在执行无限循环,因此无法进入事件循环,拦截子出口并从任务列表中清除子ID。
如果用长延时的setTimeout替换while-true循环,则该线程将获得免费的CPU,等待该子进程并将其从任务列表中清除-我已经证实了这一点。
希望这可以帮助。
关于node.js - 为什么在父级退出之前,nodejs生成过程变为<defunct>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37825670/