NodeJS child_process:指定 stdio 时未触发关闭事件:"inherit"



我正在尝试使用NodeJS在shell中执行一些命令。因此,我使用node:child_process模块。

我使用spawn函数是为了能够将子进程的输出转发到主进程的控制台。为了保持子进程输出的格式,我传递了选项stdio: "inherit"(如本问题所述:在执行child_process.spawn时保留颜色)。

但是如果我添加这个选项,子进程事件(退出,断开连接,关闭,…)不再工作了。如果我去掉这个选项,我就失去了格式,但是事件可以正常工作。当子进程关闭时,是否有一种方法可以保持格式化并得到通知?

(相关)代码:

const { spawn } = require("node:child_process");
let child = spawn("yarn", args, {
stdio: "inherit",
shell: true,
});
child.on("close", (code) => {
console.log(`child process exited with code ${code}`);
});

stdio: 'inherit'意味着您还将STDIN转发给子进程,因此,如果子进程读取STDIN,它将永远不会退出,并且您的close侦听器将永远不会被调用。特别是Node.JS的REPL (yarn node)。

根据您的需要,您可能需要:

  1. child.kill()停止子进程。然后调用close侦听器,注意code为0,第二个参数(signal)为SIGTERM(documentation);
  2. 不转发STDIN,但仍然转发STDOUT和STDERR:用stdio: ['ignore', 'inherit', 'inherit']调用spawn(文档)。当子进程自己退出并且流被释放时,close监听器将被调用。

相关内容

  • 没有找到相关文章

最新更新