我正在尝试使用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
)。
根据您的需要,您可能需要:
- 用
child.kill()
停止子进程。然后调用close
侦听器,注意code
为0,第二个参数(signal
)为SIGTERM
(documentation); - 不转发STDIN,但仍然转发STDOUT和STDERR:用
stdio: ['ignore', 'inherit', 'inherit']
调用spawn
(文档)。当子进程自己退出并且流被释放时,close
监听器将被调用。