Nodejs 子进程在 stdio 流关闭之前退出
Nodejs child process exit before stdio streams close
我刚刚对子进程进行了试验,并注意到退出事件在关闭事件之前触发 - 以下代码抛出错误,因为 this._instance.stdin 不再存在(this._instance 已经为空).
'use strict';
const spawn = require('child_process').spawn;
class Foo {
constructor() {
this._instance = null;
}
bar() {
this._instance = spawn('ls', ['-l']);
this._instance.on('close', (code, signal) => {
this._instance.stdin.end();
});
this._instance.on('exit', (code, signal) => {
this._instance = null;
});
return this._instance;
}
}
var foo = new Foo();
console.log(foo.bar());
文档指出:
"Note that when the 'exit' event is triggered, child process stdio streams might still be open."
请问这是怎么回事,为什么进程退出后流还存在?他们如何获得 'closed',这部分是由 OS 处理的,还是节点关闭了剩余的 stdio 流?
实际上,我不一定会在退出时将 this._instance 设置为 null,因为这似乎不是一件好事,而且显然有点为时过早。
close
event 的文档阐明了为什么会发生这种情况。
简而言之,stdio可以被其他还没有退出的进程使用。
我没有查看代码本身,但 OS 处理关闭 stdio 流的部分是有意义的。考虑将 stdio 输送到多个进程中(使用 tee
进行输送可能是一个很好的例子)。
在目前的情况下,我怀疑您甚至不需要 end()
stdin,因为 close
事件表明 stdin 流已经关闭。
我刚刚对子进程进行了试验,并注意到退出事件在关闭事件之前触发 - 以下代码抛出错误,因为 this._instance.stdin 不再存在(this._instance 已经为空).
'use strict';
const spawn = require('child_process').spawn;
class Foo {
constructor() {
this._instance = null;
}
bar() {
this._instance = spawn('ls', ['-l']);
this._instance.on('close', (code, signal) => {
this._instance.stdin.end();
});
this._instance.on('exit', (code, signal) => {
this._instance = null;
});
return this._instance;
}
}
var foo = new Foo();
console.log(foo.bar());
文档指出:
"Note that when the 'exit' event is triggered, child process stdio streams might still be open."
请问这是怎么回事,为什么进程退出后流还存在?他们如何获得 'closed',这部分是由 OS 处理的,还是节点关闭了剩余的 stdio 流?
实际上,我不一定会在退出时将 this._instance 设置为 null,因为这似乎不是一件好事,而且显然有点为时过早。
close
event 的文档阐明了为什么会发生这种情况。
简而言之,stdio可以被其他还没有退出的进程使用。
我没有查看代码本身,但 OS 处理关闭 stdio 流的部分是有意义的。考虑将 stdio 输送到多个进程中(使用 tee
进行输送可能是一个很好的例子)。
在目前的情况下,我怀疑您甚至不需要 end()
stdin,因为 close
事件表明 stdin 流已经关闭。