如果exec是exe,则节点JS exec不会回调

时间:2015-07-30 15:16:23

标签: javascript node.js

我在启动EXE的Node JS应用程序中有以下exec命令:

var exec = require('child_process').exec;

var theApp = 'HelloWorld';

var theCommand = 'C:/Program Files/' + theApp + '/dist/' + theApp + '-win32/' + theApp + '.exe';

exec(theCommand, function(error, stdout, stderr) {
    console.log('command callback');
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    if (error !== null) {
      console.log('exec error: ' + error);
    }
});

EXE启动正常,但没有一个控制台日志在exec命令中被触发,所以就好像调用exe不会导致回调一样。如果我执行另一个Node应用程序,例如node app.js然后它会触发回调!所以这是因为我打电话给EXE打开了!

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

当您运行的程序启动但未终止时,在程序最终退出之前,您不会得到任何类型的回调或事件。系统根本不为该条件定义任何类型的事件。子进程是否正在运行。有关其条件的任何进一步细节,您应该以某种方式与它进行通信(stdin,stdout,stderr,连接套接字,查询系统中的进程等)。

由于程序实际上可以做任何事情,所以从外部可以知道的是它是否快速退出并出现错误或快速退出并且没有错误或者它是否仍在运行。 exec()调用的返回值包含一个进程ID,因此如果有特别想知道的内容,您还可以查询有关该进程ID的一些信息。

以下是您可以做的一个示例:

var exec = require('child_process').exec;

var theCommand = "notepad sample.txt";

function runit(cmd, timeout) {

    return new Promise(function(resolve, reject) {
        var ch = exec(theCommand, function(error, stdout, stderr) {
            if (error) {
                reject(error);
            } else {
                resolve("program exited without an error");
            }
        });
        setTimeout(function() {
            resolve("program still running");
        }, timeout);
    });
}

runit(theCommand, 1000).then(function(data) {
    console.log("success: ", data);
}, function(err) {
    console.log("fail: ", err);
});

如果您正在运行的程序快速退出但没有错误(代码中第一次调用resolve()),我不清楚您希望它采取哪种方式。您可以将其更改为reject(),具体取决于您想要的行为。我认为没有错误的退出不是错误,但您的情况可能会有所不同。

注意:如果您实际上还没有等待其他程序的完成,您可能不想使用.exec(),因为这是它的构建的一部分。您可能希望使用其他一个子进程创建方法。