2015-02-25 2 views
0

Я размещаю узел как локально локальный сервер для взаимодействия с оборудованием.Nodejs не может убить внешнюю исполняемую программу Windows, выполненную самим Node

Мое веб-приложение затем обращается к Узлу с просьбой выполнить 2 исполняемых файла, в зависимости от того, какой исполняемый файл возвращает данные, сначала ответит обратно на мое веб-приложение.

Таким образом, другой исполняемый файл все еще работает в фоновом режиме, ожидая ответа от аппаратного обеспечения.

Я тоже не могу убить этот процесс, я должен либо вручную остановить узел, либо запустить его снова, либо задача уничтожить исполняемый файл.

Мой код ниже:

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 для своего front-end.

У меня есть онлайн-решение для решения, однако результаты Google все медленно становятся фиолетовыми.

Большое спасибо за тех, кто публикует их решение, пожалуйста, объясните мне детали решения. Я бы очень хотел узнать больше.

Большое вам спасибо.

ответ

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(); 
}); 
0

Я никогда не использовал exec в nodejs, но просматривал javascript. Я думаю, что Страница выполняется по каждому запросу, поэтому процессы 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(); 
}); 
+0

Hi dm03514, я видел ваше решение. Я хотел бы добавить на заметку, как 'a', так и' b' работают асинхронно, и когда-либо получаемые данные сначала уничтожают другую программу. – Cityman

 Смежные вопросы

  • Нет связанных вопросов^_^