10

所以我想在我的 node.js 程序结束时运行一个 shell 命令,并在退出之前等待输出/打印它。我尝试process.on('exit',function(){})在那里运行 child 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);将是正确的方法,不应该再次调用我自己的代码,它确实如此。我还尝试了无效的使用过的承诺(它甚至没有因为被多次解决而引发错误),并且我尝试使用布尔值来判断它是否已设置,但这也不起作用。我最后什至尝试在回调完成后抛出一个错误,但这迫使 process.exit 在错误后再次被调用。有任何想法吗?

4

1 回答 1

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);
});
于 2013-04-15T14:00:27.310 回答