我有一条命令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()不会发生任何事情。
答案 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;
});
}