Javascript 子进程无法识别kill()函数

Javascript 子进程无法识别kill()函数,javascript,node.js,child-process,kill-process,Javascript,Node.js,Child Process,Kill Process,使用NodeJS,我在MATLAB和Python中调用外部脚本 使用终端命令运行使用这些应用程序的脚本('start')效果良好 但当我试图使用kill()关闭它们时('stop'),我得到一个错误: TypeError:exec.kill不是函数 我正在使用MAC OS,以下是我的代码: var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(ht

使用NodeJS,我在MATLAB和Python中调用外部脚本 使用终端命令运行使用这些应用程序的脚本('start')效果良好

但当我试图使用kill()关闭它们时('stop'),我得到一个错误:

TypeError:exec.kill不是函数

我正在使用MAC OS,以下是我的代码:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var fs = require('fs');
var path = require('path');

const exec = require('child_process').exec;
var cmd1 =
  '/Applications/MATLAB_R2016b.app/bin/matlab -nojvm  < /Users/dorsimon/Desktop/liftrack/Testing_Classifier.m';
var cmd2 = 'python /Users/dorsimon/Desktop/liftrack/arduino_sampling_for_workout.py';

app.get('/', function(req, res) {
  res.sendfile('index.html');
});

//Whenever someone connects this gets executed
io.on('connection', function(socket) {
  console.log('A user connected');

  fs.watch('/Users/dorsimon/Desktop/liftrack/result/', function(event, test) {
    console.log('event is: ' + event);
    fs.readFile('/Users/dorsimon/Desktop/liftrack/result/results.csv', 'utf-8', function read(
      err,
      data
    ) {
      if (err) {
        console.log('err');
        throw err;
      }
      console.log(data);
      socket.send(data);
    });
  });

  fs.watch('/Users/dorsimon/Desktop/liftrack/go', function(event, test) {
    console.log('event is: ' + event);
    fs.readFile('/Users/dorsimon/Desktop/liftrack/go/go.csv', 'utf-8', function read(err, data) {
      if (err) {
        console.log('err');
        throw err;
      }
      console.log(data);
      socket.send(data);
    });
  });

  //Whenever someone disconnects this piece of code executed
  socket.on('disconnect', function() {
    console.log('A user disconnected');
  });

  socket.on('start', function() {
    exec(cmd1, function(error, stdout, stderr) {
      // command output is in stdout
    });
    exec(cmd2, function(error, stdout, stderr) {
      // command output is in stdout
    });
  });

  socket.on('stop', function() {
    exec.kill();
  });
});

http.listen(3000, function() {
  console.log('listening on *:3000');
});
var-app=require('express')();
var http=require('http')。服务器(应用程序);
var io=require('socket.io')(http);
var fs=需要('fs');
var path=require('path');
const exec=require('child_process')。exec;
var cmd1=
“/Applications/MATLAB_r2016 b.app/bin/MATLAB-nojvm
我怎样才能杀死我开始的那些孩子

谢谢
Dor

您需要存储
exec
的返回值,并调用
kill
。为了方便起见,您可以将这些值作为属性存储在
socket
上:

socket.on('start', function() {
  socket.child1 = exec(cmd1, function(error, stdout, stderr) {
    // command output is in stdout
  });
  socket.child2 = exec(cmd2, function(error, stdout, stderr) {
    // command output is in stdout
  });
});

socket.on('stop', function() {
  socket.child1.kill();
  socket.child2.kill();
});
FWIW,您可能必须对
fs.watch()
的返回值执行相同的操作,并在套接字关闭时调用它们,否则在服务器运行一段时间后,您可能会遇到问题(它会为每个
socket.io
连接创建两个观察程序,但不会删除它们,因此它们会一直存在)