Proces potomny spawn rozpoczynam w ten sposób:
let process = spawn(apiPath, {
detached: true
})
process.unref()
process.stdout.on('data', data => { /* do something */ })
Kiedy zaczynam proces, muszę go trzymać, ponieważ chcę odczytać jego dane wyjściowe. Ale tuż przed zamknięciem procesu Node (rodzic) chcę odłączyć wszystkie nieukończone procesy potomne, aby działały w tle, ale jak mówi dokumentacja :
Podczas korzystania z opcji odłączonej w celu uruchomienia długotrwałego procesu, proces nie będzie działał w tle po wyjściu z rodzica, chyba że zostanie wyposażony w konfigurację stdio, która nie jest połączona z rodzicem.
Ale z opcją stdio: 'ignore'
nie mogę odczytać, stdout
który jest problemem.
Próbowałem ręcznie zamknąć potoki przed zamknięciem procesu nadrzędnego, ale nie powiodło się:
// Trigger just before the main process end
process.stdin.end()
process.stderr.unpipe()
process.stdout.unpipe()
node.js
multithreading
spawn
Opsse
źródło
źródło
Odpowiedzi:
Po wielu testach znalazłem przynajmniej jeden sposób na rozwiązanie tego problemu: zniszczenie całej rury przed wyjściem z głównego procesu.
Jednym z trudnych punktów jest to, że proces potomny musi poprawnie obsługiwać niszczenie rur, jeśli nie, może i tak otrzymać błąd i zamknąć się. W tym przykładzie proces potomny węzła wydaje się nie mieć z tym problemu, ale może być inny w przypadku innego scenariusza.
main.js
child.js
wynik
źródło