最后一个进程结束后无法重新运行child_process.spawn()

时间:2019-10-11 18:30:33

标签: node.js child-process spawn

我有一条命令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 个答案:

答案 0 :(得分:1)

之所以会发生此问题,是因为当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;
  });
}