如何在终止前从生成的子进程中获取实时标准输出数据?

How to get live stdout data from a spawned child process before termination?

在 Windows 上使用 NodeJS (Electron) 我尝试捕获生成的 Perl 子进程的 stdout 和 stderr 输出。 我得到的 stderr 输出是实时的,但只有在子 (Perl) 终止后我才得到 stdout。我看过许多提议的解决方案,但没有任何效果。似乎 stderr 在子进程终止之前不会生成“数据”事件(至少我的输出量是这样)。

问题出在Perl还是JS这边?有解决办法吗? (我对 JS 很陌生。)

spawn()
{
    const asLibs = [];              
    this._aLibs.forEach( (sLib) => { asLibs.push("-I", sLib); } );
    const child = cp.spawn(
        this._path_perl,
        [ ...asLibs, `-m${this._module}`, '-e', `${this._module}::${this._module_fn}()`, ] );
    child.stdout.on('data', (data) => { console.log('stdout: ' + data); });
    child.stderr.on('data', (data) => { console.log('stderr: ' + data); });
}

与大多数程序一样,如果 Perl 未连接到终端,它会为 STDOUT 使用块缓冲。您可以欺骗 child 使其认为它已连接到终端(例如使用 unbuffer 工具),这将导致它进行行缓冲,或者您可以更改 Perl 程序以自动刷新其 STDOUT(例如使用$| = 1;).