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 范围我认为页面在每个请求中都被执行,所以之前请求的 a
和 b
过程是没有的更长的时间。
您可以全局存储对进程的引用,以便每个请求都可以访问进程,(真实的不完整粗略示例):
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();
});
我在本地将 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 范围我认为页面在每个请求中都被执行,所以之前请求的 a
和 b
过程是没有的更长的时间。
您可以全局存储对进程的引用,以便每个请求都可以访问进程,(真实的不完整粗略示例):
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();
});