Ich habe eine saubere Windows 8.1-Box mit lates node.js installiert (v0.10.29). Ich habe einen folgenden Testcode in zwei Dateien:Wie wird die node.js child_process.spawn() - Umleitung unter Windows korrekt verwendet?
a.js
var sub = require('child_process').spawn('node', ['b.js'], {silent: true});
sub.stdout.on("data", function (data) {console.log(data.toString());});
b.js
console.log("DEBUG 1");
console.log("DEBUG 2");
process.exit();
wenn ich a.ja
über ausführen:
node a.js
werde ich siehe "DEBUG 1" in der Konsolenausgabe - aber nicht "DEBUG 2". Wenn ich process.exit()
entferne, werden beide Zeilen korrekt angezeigt. Dieses seltsame Verhalten tritt sowohl bei fork
als auch bei spawn
auf.
Irgendwelche Hinweise? Derselbe Code funktioniert ohne Probleme unter Linux.
aktualisieren 02.07.2014
scheint dies keine Wettlaufsituation zwischen Ausgang() ist und log(), da dies zu ändernden Sequenz reine gleichen Fehler erzeugen:
function print(text, next) { console.log(text); next(); }
print("DEBUG 1", function() {
print("DEBUG 2", function() {
process.exit();
});
});
aktualisieren 03.07. 2014
silent
ist nicht in spawn()
Dokumentation aufgeführt, aber es funktioniert. Es ist in fork
Dokumentation aufgeführt, und wie ich zuvor erwähnt, ist dieses Problem gleich fork
.
Es scheint, dass, wenn ich eine Verzögerung zwischen dem letzten Ausgang einführen und process.exit()
alle korrekt funktioniert:
console.log("DEBUG 1");
console.log("DEBUG 2");
setTimeout(function() {process.exit();}, 10000);
Aber das Problem manifestiert sich nur, wenn ich Rohr Ausgang zu übergeordneten Prozess: Wenn ich entfernen silent
, sowohl Nachrichten werden auch ohne Verzögerung korrekt angezeigt, daher ist es höchstwahrscheinlich etwas falsch mit der Rohrkommunikation, nicht mit process.exit
.
Weiteres Updates 03.07.2014
Es wurde spekuliert, dass Kommentare process.exit()
beiden Prozesse beenden kann (beide a.ja
und b.ja
). Nein, es beendet nur gespawned/gabeled Prozess, ich überprüft dies durch Hinzufügen unendlich setTimeout
a.js
, es funktioniert glücklich, nachdem b.ja
beendet ist, und immer noch keine "DEBUG 2" -Linie.
Ich denke, das ist, weil node.js asynchron ist, und process.exit wird vor console.log Ende ausgeführt. Was ist, wenn Sie einen Rückruf versuchen? 'Funktion print (Text, Rückruf) {console.log (Text); callback();} print ("DEBUG1", Funktion() {print ("DEBUG2", Funktion() {process.exit();})}); ' – DrakaSAN
@DrakaSAN Aktualisierte Frage, dasselbe Problem. – grigoryvp
Jetzt ist das komisch. – DrakaSAN