Nodejs无法杀死Node本身执行的外部Windows可执行程序

时间:2015-02-25 14:10:36

标签: javascript angularjs node.js response kill-process

我在本地托管Node作为服务器与硬件交互。

我的Web应用程序然后向Node请求执行2个可执行文件,无论哪个可执行文件首先返回数据,都会将其响应回我的Web应用程序。

这样做会导致其他可执行文件仍在后台运行,等待硬件响应。

我无法杀死该进程,我必须手动停止Node并再次运行它或任务终止该可执行文件。

我的代码如下:

Node.js的

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

app.get('/Page', function (req, res) {
    var Page = function () {
        var a = exec('F:/Example1.exe', function (err, data) {
            console.log(err);
            console.log(data);
            b.kill();
            if (!res.headersSent) {
                res.send(data);
            }
        });
        var b = exec('F:/Example2.exe', function (err, data) {
            console.log(err);
            console.log(data);
            a.kill();
            if (!res.headersSent) {
                res.send(data);
            }
        });
    }
    Page();
});

显然,即使使用kill命令,我仍然无法终止该过程。

我应该让你们知道,我也在使用AngularJS作为我的前端。

我已经在网上寻找解决方案,但谷歌的搜索结果都慢慢变为紫色。

非常感谢那些发布解决方案的人,请向我解释解决方案的详细信息。我真的想了解更多。

非常感谢你。

2 个答案:

答案 0 :(得分:1)

exec的问题是它会等到程序执行后才能运行回调。

您可以使用spawn代替,然后您可以控制该流程的运行。

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

 app.get('/Page', function(req, res) {
     var Page = function() {
         var a = spawn('F:/Example1.exe');
         var b = spawn('F:/Example2.exe');
         var aData = '',
             bData = '';
         a.stdout.on('data', function(data) {
             aData += data.toString();
         });
         b.stdout.on('data', function(data) {
             bData += data.toString();
         });
         a.on('close', function() {
             b.kill();
             if (!res.headersSent) {
                 res.send(aData);
             }
         });
         b.on('close', function() {
             a.kill();
             if (!res.headersSent) {
                 res.send(bData);
             }
         });
     }
     Page();
 });

答案 1 :(得分:0)

我从未在nodejs中使用过exec,但javascript范围我认为每次请求都会执行Page,因此先前请求中的ab进程不再存在。

您可以全局存储对流程的引用,以便每个请求都可以访问流程,(真正不完整的粗略示例):

var exec = require('child_process').exec;    
var a = null;
var b = null;
app.get('/Page', function (req, res) {
    var Page = function () {
        if (a) {
           // a is already a running process? Do something?
        } else {
           // start a ? 
           a = exec('your command');
        }

        if (b) {
           // b is already running? Do something?
        }
    }
    Page();
});