Node.js拦截process.exit

时间:2012-05-15 05:43:02

标签: node.js process exec exit

所以我想在node.js程序的末尾运行一个shell命令,并在退出之前等待输出/打印它。我尝试process.on('exit',function(){})并在那里运行子exec命令,但程序在回调之前退出。所以我在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);将是正确的方法,不应该再次调用我自己的代码,它确实如此。我也尝试了使用的promises,它不起作用(它甚至没有因为多次解析而抛出错误)而且我尝试使用布尔值,如果它已经设置但是也没有用。我终于甚至尝试在回调完成后抛出一个错误,但这会强制在错误之后再次调用process.exit。有什么想法吗?

1 个答案:

答案 0 :(得分:10)

通过process.exit时间,你来不及做任何异步。我认为你不能绕过异步部分,因为你显然需要执行shell命令。您可以收听各种退出信号,执行异步操作,然后在准备好时自己调用process.exit。请注意,在进程存在之前,您将获得所有信号,因此您需要跟踪状态以确保shell命令仅运行一次。以下内容适用于ctrl-c信号:

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