Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Can';t在最后一个进程结束后重新运行child_process.spawn()_Node.js_Child Process_Spawn - Fatal编程技术网

Node.js Can';t在最后一个进程结束后重新运行child_process.spawn()

Node.js Can';t在最后一个进程结束后重新运行child_process.spawn(),node.js,child-process,spawn,Node.js,Child Process,Spawn,我有一个命令telnet,它接收作为参数的IP和端口,并在运行时从远程程序获取日志。我正在做的是:节点将创建一个进程telnet,过滤日志中的一些信息,并在关闭时尝试重新运行telnet。第一次它运行得很好,但是当我关闭远程程序时,节点desn不会尝试重新运行telnet 'use strict'; const { spawn } = require( 'child_process' ); const cmd = 'telnet'; const params = ['10.10.10.10',

我有一个命令
telnet
,它接收作为参数的IP和端口,并在运行时从远程程序获取日志。我正在做的是:节点将创建一个进程
telnet
,过滤日志中的一些信息,并在关闭时尝试重新运行
telnet
。第一次它运行得很好,但是当我关闭远程程序时,节点desn不会尝试重新运行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;
  });
}