Comienzo un proceso de generación de hijos de esta manera:
let process = spawn(apiPath, {
detached: true
})
process.unref()
process.stdout.on('data', data => { /* do something */ })
Cuando comienzo el proceso, necesito mantenerlo adjunto porque quiero leer su salida. Pero justo antes de cerrar mi proceso de Nodo (el padre), quiero separar todos los procesos secundarios no terminados para mantenerlos ejecutándose en segundo plano, pero como dice la documentación :
Cuando se utiliza la opción separada para iniciar un proceso de larga duración, el proceso no se mantendrá ejecutándose en segundo plano después de que el padre salga a menos que cuente con una configuración estándar que no esté conectada al padre.
Pero con la opción stdio: 'ignore'
no puedo leer lo stdout
que es un problema.
Traté de cerrar las tuberías manualmente antes de cerrar el proceso padre, pero no tuvo éxito:
// Trigger just before the main process end
process.stdin.end()
process.stderr.unpipe()
process.stdout.unpipe()
fuente
Respuestas:
Después de muchas pruebas, encontré al menos una forma de resolver este problema: destruir todas las tuberías antes de abandonar el proceso principal.
Un punto complicado es que el proceso secundario tiene que manejar correctamente la destrucción de las tuberías, de lo contrario, podría tener un error y cerrarse de todos modos. En este ejemplo, el proceso secundario del nodo parece no tener ningún problema con esto, pero podría ser diferente con otro escenario.
main.js
child.js
salida
fuente