所以我想在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。有什么想法吗?
答案 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);
});