2012-05-15 2 views
9

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?

+3

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

+0

Questo è comprensibile, ma esiste un altro modo per questo? – jayarjo

+0

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

risposta

10

Da process.exit time, sei in ritardo per fare qualcosa asincrona. Non penso che tu possa aggirare la parte asincrona, dato che apparentemente hai bisogno di eseguire un comando di shell. Puoi ascoltare vari segnali di uscita, fare il tuo async, quindi chiamare process.exit te stesso quando sei pronto. Nota che riceverai tutti i segnali finché il processo non esiste, quindi dovrai monitorare lo stato per assicurarti che il comando della shell venga eseguito una sola volta. Di seguito lavorerà per il segnale Ctrl-C:

process.on('SIGINT', function() { 
    console.log('Received Signal'); 
    setTimeout(function() { 
     console.log('Exit'); 
     process.exit(1); 
    }, 10000); 
});