Ich starte einen Spawn-Child-Prozess folgendermaßen:
let process = spawn(apiPath, {
detached: true
})
process.unref()
process.stdout.on('data', data => { /* do something */ })
Wenn ich den Prozess starte, muss ich ihn angehängt halten, da ich seine Ausgabe lesen möchte. Aber kurz bevor ich meinen Knotenprozess (den übergeordneten Prozess) schließe, möchte ich alle nicht abgeschlossenen untergeordneten Prozesse trennen, damit sie im Hintergrund ausgeführt werden. In der Dokumentation heißt es jedoch:
Wenn Sie die getrennte Option verwenden, um einen Prozess mit langer Laufzeit zu starten, bleibt der Prozess nach dem Beenden des übergeordneten Elements nicht im Hintergrund ausgeführt, es sei denn, er verfügt über eine Standardkonfiguration, die nicht mit dem übergeordneten Prozess verbunden ist.
Aber mit der Option stdio: 'ignore'
kann ich nicht lesen, stdout
was ein Problem ist.
Ich habe zuvor versucht, die Pipes manuell zu schließen, um den übergeordneten Prozess zu schließen, aber es ist nicht erfolgreich:
// Trigger just before the main process end
process.stdin.end()
process.stderr.unpipe()
process.stdout.unpipe()
quelle
Antworten:
Nach vielen Tests habe ich mindestens einen Weg gefunden, um dieses Problem zu lösen: alle Rohre vorher zu zerstören, um den Hauptprozess zu verlassen.
Ein kniffliger Punkt ist, dass der untergeordnete Prozess die zerstörenden Pipes korrekt behandeln muss. Andernfalls kann ein Fehler auftreten und trotzdem geschlossen werden. In diesem Beispiel scheint der untergeordnete Knotenprozess kein Problem damit zu haben, aber es könnte bei anderen Szenarien anders sein.
main.js
child.js
Ausgabe
quelle