簡體   English   中英

NodeJS Fork無法殺死子進程

[英]NodeJS Fork can't get childprocess to kill

我在這里碰壁,也許這只是一個小問題,由於我對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的例子。

希望該信息足夠,希望有人可以幫助我。
提前致謝!

由於killProgram()BLELamp范圍之外的獨立函數,因此您需要通過綁定BLELamp this來調用具有正確范圍的BLELamp 使用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的原型。 我將更改名稱以避免混淆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM