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 参考资料。
如果省略管道,子进程会将输出写入其自己的标准输出,这与父进程的标准输出不同。所以,你看不到它。
我正在 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 参考资料。
如果省略管道,子进程会将输出写入其自己的标准输出,这与父进程的标准输出不同。所以,你看不到它。