Не могу перезапустить child_process.spawn () после завершения последнего процесса - PullRequest
0 голосов
/ 11 октября 2019

У меня есть команда telnet, которая получает в качестве параметра IP-адрес и порт и получает журнал из удаленной программы во время работы. Что я делаю: узел создаст процесс telnet, отфильтрует журнал для некоторых сведений и попытается повторно запустить telnet в случае его закрытия. Сначала он работает хорошо, но когда я закрываю удаленную программу, узел не пытается перезапустить telnet.

'use strict';

const { spawn } = require( 'child_process' );
const cmd = 'telnet';
const params = ['10.10.10.10', '1010'];
var telnet;

let isRunning = false;

connect();
connectionCheckRoutine()

telnet.stdout.on( 'data', data => {
  console.log( `> ${data}` );
  isRunning = true;
} );

telnet.stderr.on('data', data => {
  console.log(`err: ${data}` );
} );

telnet.on('close', code => {
  console.log( `child process exited with code ${code}` );
  isRunning = false;
} );

function connect(){
  telnet = spawn( cmd, params);
}

async function connectionCheckRoutine(){
  while(true){
    await sleep(5000);
    if(!isRunning){
      console.log('Reconnecting...');
      connect();
    }
  }
}

async function sleep(millis) {
    return new Promise(resolve => setTimeout(resolve, millis));
}

Я ожидал, что после завершения процесса я могу попытаться переподключиться с помощью child_process.spawn(), но ничего не произойдет, если я вызову spawn () еще раз.

1 Ответ

1 голос
/ 11 октября 2019

Проблема возникает из-за того, что прослушиватели событий, которые вы регистрируете для событий дочернего процесса, не перерегистрируются, когда переменная telnet перезаписывается новым дочерним процессом.

Попробуйте переместить регистрацию обработчиков событий внутрьфункция connect, обеспечивающая перерегистрацию обработчиков при каждом порождении дочернего процесса:

function connect(){
  const telnet = spawn(cmd, params);

  telnet.stdout.on( 'data', data => {
    console.log( `> ${data}` );
    isRunning = true;
  });

  telnet.stderr.on('data', data => {
    console.log(`err: ${data}` );
  });

  telnet.on('close', code => {
    console.log( `child process exited with code ${code}` );
    isRunning = false;
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...