Ho una casella di Windows 8.1 pulita con leds node.js installato (v0.10.29). Ho un seguente codice di prova in due file:Come utilizzare correttamente node.js child_process.spawn() reindirizzamento su Windows?
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();
se eseguo a.ja
via:
node a.js
Lo farò vedi "DEBUG 1" nell'output della console - ma non "DEBUG 2". Se rimuovo process.exit()
, entrambe le linee verranno visualizzate correttamente. Questo strano comportamento si verifica sia con fork
e spawn
.
Eventuali suggerimenti? Lo stesso codice funziona senza problemi su linux.
Aggiornamento 02.07.2014
Sembra che questa non è una condizione di competizione tra exit() e log(), in quanto la modifica di questa sequenza di pura produrre lo stesso errore:
function print(text, next) { console.log(text); next(); }
print("DEBUG 1", function() {
print("DEBUG 2", function() {
process.exit();
});
});
Aggiornamento 03.07. 2014
silent
non è elencato nella documentazione spawn()
, ma funziona. È elencato nella documentazione fork
e, come accennato in precedenza, questo problema è lo stesso con fork
.
Sembra che se presento un ritardo tra l'ultima uscita e process.exit()
tutto funziona correttamente:
console.log("DEBUG 1");
console.log("DEBUG 2");
setTimeout(function() {process.exit();}, 10000);
Ma il problema si manifesta solo se i tubo output processo padre: se tolgo silent
, sia i messaggi vengono visualizzati correttamente anche senza ritardo, quindi probabilmente è qualcosa di sbagliato nella comunicazione pipe, non con process.exit
.
Ulteriori aggiornamenti 03.07.2014
è stato ipotizzato nei commenti che process.exit()
può risolvere entrambi i processi (sia a.ja
e b.ja
). No, termina solo il processo generato/biforcuto, ho verificato questo aggiungendo infinito a a.js
, funziona felicemente dopo che b.ja
è terminato, e ancora nessuna riga "DEBUG 2".
Penso che s perché node.js è asincrono, e process.exit viene eseguito prima di console.log fine. Cosa succede se provi in una richiamata? 'funzione stampa (testo, callback) {console.log (testo); callback();} print ("DEBUG1", function() {print ("DEBUG2", function() {process.exit();})}); ' – DrakaSAN
@DrakaSAN Domanda aggiornata, stesso problema. – grigoryvp
Ora è strano. – DrakaSAN