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;
});
}