【问题标题】:Child Process Output Not Shown in Node.JSNode.JS 中未显示子进程输出
【发布时间】:2021-04-17 07:10:22
【问题描述】:

我在 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 block 里面的三行)

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

有人可以帮忙吗?

我这里有什么遗漏吗?

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

【问题讨论】:

    标签: node.js spawn


    【解决方案1】:

    如果 sp.stdout.pipe(process.stdout) 行被注释掉,是不是表示子进程的 process.env 也没有写?

    没有。环境变量仍然存在。

    说明

    你得到的输出是预期的。

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

    另一个选择是使用子进程的事件。您可以将处理程序附加到子进程的 stdout data 事件。例如

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 2014-06-30
      • 2011-12-29
      相关资源
      最近更新 更多