Je lance un processus enfant de réapparition de cette façon:
let process = spawn(apiPath, {
detached: true
})
process.unref()
process.stdout.on('data', data => { /* do something */ })
Lorsque je démarre le processus, je dois le garder attaché parce que je veux lire sa sortie. Mais juste avant de fermer mon processus Node (le parent), je veux détacher tous les processus enfants non terminés pour les faire fonctionner en arrière-plan, mais comme le dit la documentation :
Lorsque vous utilisez l'option détachée pour démarrer un processus de longue durée, le processus ne continuera pas à s'exécuter en arrière-plan après la sortie du parent, sauf s'il est fourni avec une configuration stdio qui n'est pas connectée au parent.
Mais avec l'option, stdio: 'ignore'
je ne peux pas lire ce stdout
qui est un problème.
J'ai essayé de fermer manuellement les tuyaux avant de fermer le processus parent, mais il échoue:
// Trigger just before the main process end
process.stdin.end()
process.stderr.unpipe()
process.stdout.unpipe()
la source
Réponses:
Après de nombreux tests, j'ai trouvé au moins un moyen de résoudre ce problème: détruire tous les tuyaux avant de quitter le processus principal.
Un point délicat est que le processus enfant doit gérer correctement la destruction des tuyaux, sinon il pourrait avoir une erreur et se fermer de toute façon. Dans cet exemple, le processus enfant du nœud ne semble pas avoir de problème avec cela, mais il pourrait être différent avec un autre scénario.
main.js
child.js
production
la source