我们先来看一下现象

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/

10-09 20:08
查看更多