Node.js拦截process.exit

所以我想在我的node.js程序的末尾运行一个shell命令,然后在退出之前等待输出/打印它。 我尝试了process.on('exit',function(){})并在那里运行了子exec执行命令,但是在callback之前退出了程序。 所以,而是我使用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)); 

上述每个结果都执行了我的shell命令两次,然后退出。 我也尝试过在最后没有调用任何东西,而这样做使得我的命令只执行一次,这个过程挂起而不是退出。 除非有什么简单的我想念我感觉就像我第一次尝试old_exit.apply(process,arguments); 将是正确的方式,不应该再次调用我自己的代码,它的确如此。 我也试过使用的承诺,它没有工作(它甚至没有抛出一个多次解决的错误),我尝试使用布尔值,如果它已经设置,但也没有工作。 我甚至在callback完成后甚至尝试抛出一个错误,但是这个强制的process.exit在错误之后再次被调用。 有任何想法吗?

通过process.exit时间,你做任何asynchronous都太迟了。 我不认为你可以绕过asynchronous部分,因为你显然需要执行一个shell命令。 你可以听各种退出信号,做你的asynchronous的东西,然后调用process.exit自己当你准备好了。 注意你会得到所有的信号,直到进程存在,所以你会想跟踪状态,以确保你的shell命令只运行一次。 以下内容适用于ctrl-c信号:

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