Quindi volevo eseguire un comando shell alla fine del mio programma node.js e attendere l'output/stamparlo prima di uscire. Ho provato process.on('exit',function(){})
e ho eseguito il comando figlio exec lì, ma il programma è uscito prima del callback. Così invece ho usato una chiusura su process.exit ma sto ottenendo alcuni strani risultati. Le basi del codice sono:Node.js intercettazione process.exit
process.exit = (function(old_exit){
return function(code){
var exec = require('child_process').exec;
var child;
child = exec("my shell command", function (error, stdout, stderr) {
if (error !== null) {
console.log('exec error: ' + error);
}
console.log(stdout);
//I first had this as the concluding line:
old_exit.apply(process,arguments);
//and I also tried
old_exit.apply(process,[]);
//and even (which I know is not in the right scope)
old_exit(code);
//and also
process.exit = old_exit;
process.exit(code);
});
}
}(process.exit));
Ognuno dei risultati di cui sopra ha eseguito il comando della shell esattamente due volte e poi è uscito. Ho anche provato a non chiamare nulla alla fine e mentre lo manteneva in modo che il mio comando fosse eseguito solo una volta, il processo era sospeso invece di uscire alla fine. A meno che non ci sia qualcosa che semplicemente mi manca, mi sento come se il primo tentativo che avevo old_exit.apply(process,arguments);
fosse il modo corretto e non dovessi chiamare di nuovo il mio codice, lo fa. Ho anche provato delle promesse usate che non funzionavano (non ha nemmeno commesso un errore per essere risolti più volte) e ho provato ad usare un booleano per se fosse stato impostato ma non ha funzionato neanche. Alla fine ho persino provato a lanciare un errore dopo che il callback è terminato, ma questo processo forzato è stato richiamato dopo l'errore. Qualche idea?
Una volta che un evento 'exit' è stata gestita, il ciclo degli eventi non è più in esecuzione e quindi non si può fare nulla asincrono da un callback' exit'. – ebohlman
Questo è comprensibile, ma esiste un altro modo per questo? – jayarjo
Anche se questo è vecchio ora e non ne ho più bisogno, non stavo cercando di fare qualcosa di asincrono dal callback dell'uscita, stavo cercando di evitare quella limitazione intercettando la chiamata process.exit in modo da poter fare il mio asynch e quindi avviare la vera process.exit che non consentirà asynch da lì. Sebbene non sia stato verificato, penso che almeno uno dei precedenti potrebbe essere la soluzione giusta ed è stato in realtà un conflitto con il framework di test di mocha che stava anche facendo un lavoro di uscita di processo speciale che ha causato i miei problemi particolari. – user1084563