2017-05-16 3 views
0

Mit Knoten js nicht erkannt Ich externes Skript in MATLAB und Python bin Aufruf Die gut Terminal arbeitet mit Befehlen die Skripte unter Verwendung dieser Anwendung (‚Start‘)kill() Funktion für child_process

Aber laufen wenn ich versuche, sie mit kill schließen() ('Stop') ich erhalte eine Fehlermeldung:

TypeError: exec.kill is not a function

ich MAC OS bin mit und dies ist mein Code:

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'); 
}); 

Wie ca n töte ich diese child_process, die ich angefangen habe?

Dank Dor

Antwort

0

Sie müssen den Rückgabewert von exec und kill auf das nennen speichern. Sie können diese Werte als Eigenschaften auf socket für Bequemlichkeit speichern:

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, werden Sie wahrscheinlich das gleiche mit den Rückgabewerten von fs.watch() zu tun haben, und close() auf sie anrufen, wenn der Socket geschlossen wird, sonst werden Sie Es treten wahrscheinlich Probleme auf, nachdem der Server eine Zeit lang ausgeführt wurde (es erstellt zwei Watcher für jede socket.io-Verbindung, entfernt sie aber nicht, sodass sie sich nicht bewegen).