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?
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
Eso se entiende, pero ¿hay alguna otra manera para esto? – jayarjo
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