【问题标题】:Nodejs unable to kill external windows executable program executed by Node itselfNodejs无法杀死Node自己执行的外部windows可执行程序
【发布时间】:2015-04-27 13:46:20
【问题描述】:

我在本地托管 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 作为我的前端。

我已经在网上寻找解决方案,但是 Google 的结果都慢慢变紫了。

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

非常感谢。

【问题讨论】:

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


    【解决方案1】:

    我从未在 nodejs 中使用过exec,但我认为 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();
    });
    

    【讨论】:

    • 您好 dm03514 ,我已经看到了您的解决方案。我想补充一点,ab 都是异步运行的,谁先接收到数据就会杀死他们的其他程序。
    【解决方案2】:

    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();
     });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-16
      • 2012-04-01
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多