NodeJS Fork无法获取子进程来杀死

时间:2017-04-27 14:49:35

标签: javascript node.js

我在这里碰壁,也许这只是一个小问题,由于我对NodeJS缺乏经验,我无法看到解决方案。

现在我正在构建一个由主应用程序控制的BT设备,我已经决定使用Bleno模块在​​带有NodeJS的Raspberry PI 3上进行原型设计。

到目前为止一切正常,设备被发现,我可以通过蓝牙设置和获取值。但要分开不同的"程序"设备可以从蓝牙逻辑执行(因为循环等)我选择将这些提取到外部NodeJS文件。

这里的想法是使用NodeJS fork模块并通过主进程控制这些进程的启动和停止。

但在这里我的问题开始了。我可以毫无问题地分叉不同的JavaScript文件并执行这些文件,但是我无法让它们停止,我也不知道如何修复它。

这里是代码(简化):

var util = require('util');
var events = require('events');
var cp = require('child_process');
...
var ProgramTypeOne = {
NONE:    0,
ProgramOne: 1,
...
};
...
var currentProgram=null;
...

function BLEDevice() {
  events.EventEmitter.call(this);
  ...
  this.currentProgram=null;
  ...
  }

util.inherits(BLELamp, events.EventEmitter);

BLELamp.prototype.setProgram = function(programType, programNumber) {
  var self = this;
  var result=0;

  if(programType=="ProgramTypeOne "){
    if(programNumber==1){
      killProgram();
      this.currentProgram=cp.fork('./programs/programOne');
      result=1;
    }else if(programNumber==2){
...
  }

  self.emit('ready', result);
};

...
module.exports.currentProgram = currentProgram;
...
function killProgram(){
  if(this.currentProgram!=null){
          this.currentProgram.kill('SIGTERM');
      }
}

变量currentProgram似乎存在问题,似乎从来没有从fork调用中获取子进程。 由于我从未使用JavaScript进行过扩展,除了网站上的一些小脚本,我不知道我的错误到底在哪里。 我认为它与类变量的处理有关。

我的出发点是Bleno的Pizza例子。

希望信息足够,有人可以帮助我 提前谢谢!

1 个答案:

答案 0 :(得分:1)

由于killProgram()BLELamp范围之外的独立函数,因此您需要通过将BLELamp绑定为this来调用具有正确范围的killProgram。使用apply(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)应解决它。以下我希望能解决它(唯一的换行是调用killProgram):

BLELamp.prototype.setProgram = function(programType, programNumber) {
  var self = this;
  var result=0;

  if(programType=="ProgramTypeOne "){
    if(programNumber==1){
      killProgram.apply(this);
      this.currentProgram=cp.fork('./programs/programOne');
      result=1;
    }else if(programNumber==2){
...
  }

  self.emit('ready', result);
};

作为旁注,您的代码有点令人困惑,因为您有一个独立的var currentProgram,然后是一对具有自己的绑定this.currentProgram的原型。我会更改名称以防止混淆。