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

Can't rerun child_process.spawn() after last process ends

我有一个命令 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() 什么也没有发生。

出现此问题是因为当 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;
  });
}