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

Nodejs unable to kill external windows executable program executed by Node itself

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

我的 Web 应用程序然后向 Node 发出请求以执行 2 个可执行文件,无论哪个可执行文件 returns 数据首先将其响应回我的 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 的结果都在慢慢变成紫色。

非常感谢那些post他们的解决方案,请向我解释解决方案的细节。我真的很想了解更多。

非常感谢。

我从来没有在 nodejs 中使用过 exec 但是 javascript 范围我认为页面在每个请求中都被执行,所以之前请求的 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();
});

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

您可以改用 spawn,然后您可以控制进程,因为它是 运行ning。

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