Node.js: как отправить управление C дочернему процессу

Я пишу одну веб-оболочку Linux, используя node.js + socket.io. Простые команды вроде ls, cd работают хорошо. Но когда выдается такая команда, как ping google.com, стандартный вывод печатается бесконечно. Я попытался отправить Ctrl + C на стандартный ввод, но безуспешно.

1) запустить процесс "bash"

spawn = require('child_process').spawn;
var sh = spawn('bash');

2) отправить стандартный вывод bash на socket.io

sh.stdout.on('data', function(data) {
   console.log('stdout' + data);
   listener.sockets.emit("stdout",new Buffer(data));
});

3) Отправка Ctl C (\ x03) на стандартный ввод bash. var listener = io.listen(сервер);

listener.set('log level',1);
listener.sockets.on('connection', function(client){
   client.on('message', function(data){
      if(data === "KILL") {
         console.log('!!!!' + data);
         sh.stdin.write('\x03');
         client.broadcast.send(new Buffer("KILLING "));
         //return;
      };
      console.log(data);
      sh.stdin.write(data+"\n");
      client.broadcast.send(new Buffer("> "+data));
   });
});

Я застрял в этой точке. Похоже на


person Herry    schedule 27.07.2012    source источник


Ответы (2)


Попробуйте process.kill(sh.pid). Я использую это, чтобы убить рабочих в кластере, когда мой главный процесс закрывается. sh.signalCode должно быть равно SIGTERM. Конечно, я понятия не имею, работает ли это в Windows.

person cjohn    schedule 28.07.2012
comment
Должно быть process.kill(sh.pid, 'SIGINT'); - person ebohlman; 29.07.2012
comment
По умолчанию в OS X используется SIGTERM. Я предполагаю, что вызов прекращения или прерывания зависит от ОС. - person cjohn; 30.07.2012

попробуй stdout.push(null). Я попробовал это на узле 12. Это не убьет ваш дочерний процесс, вместо этого он сообщит вам выходной поток, что входного потока больше нет.

person Manish Kumar    schedule 15.05.2020