Node.js拦截process.exit

use*_*563 10 process exec exit node.js

所以我想在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));
Run Code Online (Sandbox Code Playgroud)

上面的每一个结果都执行了我的shell命令两次,然后退出.我也尝试不在最后调用任何东西,虽然这使得我的命令只执行了一次,但是进程挂起而不是在最后退出.除非有一些东西,我只是缺少了,我觉得我的第一次尝试old_exit.apply(process,arguments);是正确的方式,不应该再次调用我自己的代码,它确实如此.我也尝试了使用的promises,它不起作用(它甚至没有因为多次解析而抛出错误)而且我尝试使用布尔值,如果它已经设置但是也没有用.我终于甚至尝试在回调完成后抛出一个错误,但这会强制在错误之后再次调用process.exit.有任何想法吗?

小智 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);
});
Run Code Online (Sandbox Code Playgroud)