node.js - Node.JS 中未显示子进程输出
问题描述
我在 NodeJS 中执行下面的代码。
如下所示,父进程生成一个子进程并设置 env 变量。此变量用于在执行文件时决定进程是父进程还是子进程。
const {IS_CHILD} = process.env
if(IS_CHILD){
console.log('CHILD');
console.log('child pid = ',process.pid);
console.log('child env values = ',process.env);
}else{
const {parse} = require('path')
const {root} = parse(process.cwd());
console.log('PARENT');
console.log('parent pid = ',process.pid)
const {spawn} = require('child_process');
const sp = spawn(process.execPath,[__filename], {
cwd: root,
env: {IS_CHILD : true}
});
sp.stdout.pipe(process.stdout); // if this is commented
}
我面临的问题是,如果我在父进程中注释掉代码sp.stdout.pipe(process.stdout)
,子进程输出不会显示在控制台上。IS_CHILD
( if 块内的三行)
如果sp.stdout.pipe(process.stdout)
line 被注释掉,是否意味着process.env
子进程也没有被写入?
有人可以在这里帮忙吗?
我在这里错过了什么吗?
我假设即使sp.stdout.pipe(process.stdout)
line 被注释掉,child process
也应该env variable
在我们执行时设置在其中spawn command
解决方案
如果 sp.stdout.pipe(process.stdout) 行被注释掉,这是否意味着子进程的 process.env 也没有被写入?
不,环境变量仍然存在。
解释
你得到的输出是预期的。
当您运行脚本时,它会启动父进程。因此,您将在控制台中看到的是父进程的输出。然后,通过spawn
你产生一个子进程。子进程是一个完全不同的进程。为了在父进程中看到它的输出,你可以像你一样使用管道。
另一种选择是使用子进程的事件。您可以将处理程序附加到子进程的标准输出data
事件。例如
sp.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
有关子进程的详细信息,请参阅 子进程参考。
如果省略管道,子进程会将输出写入其自己的标准输出,该标准输出不同于父进程的标准输出。因此,你看不到它。