首页 > 解决方案 > 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

标签: node.jsspawn

解决方案


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

不,环境变量仍然存在。

解释

你得到的输出是预期的。

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

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

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

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

如果省略管道,子进程会将输出写入其自己的标准输出,该标准输出不同于父进程的标准输出。因此,你看不到它。


推荐阅读