Tengo una instalación nueva de Ubuntu 20.04.2 (ejecutar en una máquina virtual en mac).
Instalé Node.js v16 (a través del canal de software oficial) y observé un problema extremadamente extraño. Los procesos secundarios generados con studio: 'pipe' no emiten ningún dato stdout o stderr .
Pasos para reproducir:
niño.js
console.log("Some text"); const interval = setInterval(() => { console.log("Other text") }, 100) setTimeout(() => clearInterval(interval), 1000);principal.js
const childProcess = require('child_process'); const child = childProcess.spawn('node', ['child.js'], { stdio: 'pipe'}); if (child.stdout) { console.log("Attach std listeners") child.stdout.on('data', data => console.log("Child stdout:", String(data))); child.stderr.on('data', data => console.log("Child stderr:", String(data))); } child.on('close', (...args) => { console.log("Child closed", args); }); Ejecutar node test.js produce lo siguiente en la terminal de Ubuntu para mí:
Attach std listeners CLOSED [ 0, null ] (cuando lo ejecuto en macOS, obtengo como se esperaba múltiples Child stdout: Other text en la salida)
Mientras que si cambio stdio para inherit en el script principal, se expone la salida del proceso secundario:
Some text Other text Other text Other text Other text Other text Other text Other text Other text Other text Child closed [ 0, null ] Me indica que el proceso secundario se ejecuta sin problemas, pero por alguna razón, un niño no emite stdout ni stderr cuando se supone que su salida debe canalizarse.
El mismo problema ocurre con otras versiones de Node.js que verifiqué (v14, v17, v18nightly)
Parece que el problema es cuando Node.js se instala a través del administrador de dependencias Snap (por lo tanto, el instalador oficial del software Ubuntu).
Luego, el software se coloca en un espacio aislado en contenedores de solo lectura, con acceso restringido a otras partes del sistema y, como se muestra, eso no puede funcionar para Node.js.
Solución: no instale Node.js a través de Snap, instálelo a través de apt en su lugar