我在本地托管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作为我的前端。
我已经在网上寻找解决方案,但谷歌的搜索结果都慢慢变为紫色。
非常感谢那些发布解决方案的人,请向我解释解决方案的详细信息。我真的想了解更多。
非常感谢你。
答案 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,因此先前请求中的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();
});