Node.JS 中未显示子进程输出

Child Process Output Not Shown in Node.JS

我正在 NodeJS 中执行以下代码。

如下所示,父进程生成子进程并设置环境变量。 该变量用于决定执行文件时进程是父进程还是子进程。

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 block 内的三行)

如果 sp.stdout.pipe(process.stdout) 行被注释掉,是否意味着子进程的 process.env 也没有被写入?

有人可以帮忙吗?

我在这里遗漏了什么吗?

我假设即使 sp.stdout.pipe(process.stdout) 行被注释掉,child process 也应该在其中设置 env variable 因为我们已经执行了 spawn command

If sp.stdout.pipe(process.stdout) line is commented out , does that mean that process.env for child process is also not written ?

没有。环境变量还在。

说明

您得到的输出符合预期。

当您 运行 您的脚本时,它会启动父进程。所以你将在控制台中看到的是父进程的输出。然后,通过 spawn 您将生成一个子进程。子进程是一个完全不同的进程。为了在父进程中看到它的输出,你可以像你一样使用管道。

另一种选择是使用子进程的事件。您可以将处理程序附加到子进程的标准输出 data 事件。例如

sp.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

有关子进程的详细信息,请参阅 child process 参考资料。

如果省略管道,子进程会将输出写入其自己的标准输出,这与父进程的标准输出不同。所以,你看不到它。