2012-05-15 18 views
9

Así que quería ejecutar un comando de shell al final de mi programa node.js y esperar la salida/imprimirlo antes de salir. Intenté process.on('exit',function(){}) y ejecutando el comando child exec allí, pero el programa salió antes de la devolución de llamada. Así que, en cambio, utilicé un cierre en process.exit pero obtengo algunos resultados extraños. Lo básico del código es:Node.js interceptando 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)); 

Cada uno de los resultados anteriores ejecutó mi comando de shell exactamente dos veces y luego salió. También traté de no llamar nada al final y mientras eso lo mantenía para que mi comando se ejecutara solo una vez, el proceso se colgó en lugar de salir al final. A menos que haya algo simplemente me falta, siento que el primer intento que tuve old_exit.apply(process,arguments); sería la forma correcta y no debería llamar a mi propio código nuevamente, lo hace. También probé las promesas utilizadas que no funcionaron (ni siquiera arrojó un error para ser resuelta varias veces) y traté de usar un booleano para si se había establecido pero tampoco funcionó. Finalmente, incluso intenté arrojar un error después de que finalizó la devolución de llamada, pero este proceso forzado salió a ser llamado nuevamente después del error. ¿Algunas ideas?

+3

Una vez que un evento 'exit' se ha manejado, el bucle de eventos ya no está funcionando lo que no puede hacer nada asíncrona de una devolución de llamada' exit'. – ebohlman

+0

Eso se entiende, pero ¿hay alguna otra manera para esto? – jayarjo

+0

Aunque esto es viejo ahora y ya no lo necesito, no estaba tratando de hacer algo a partir de la devolución de llamada de salida, estaba tratando de evitar esa limitación interceptando el proceso. Salir de llamada en sí mismo para poder hacer mi asincronización y luego inicie el proceso real.exit que no permitirá asynch desde allí. Aunque no se ha probado, creo que al menos uno de los anteriores podría ser la solución correcta y, en realidad, era un conflicto con el marco de prueba de mocha que también estaba haciendo un trabajo de salida de proceso especial que causaba mis problemas particulares. – user1084563

Respuesta

10

Por proceso, tiempo de salida, es demasiado tarde para hacer cualquier cosa asincrónica. No creo que puedas esquivar la parte asincrónica, ya que aparentemente necesitas ejecutar un comando de shell. Puedes escuchar varias señales de salida, hacer tus cosas de sincronización y luego llamar al proceso. Sal a ti mismo cuando estés listo. Tenga en cuenta que recibirá todas las señales hasta que exista el proceso, por lo que querrá seguir el estado para asegurarse de que su comando de shell solo se ejecute una vez. El siguiente trabajo de la señal ctrl-c:

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