• Publicidad

Ayuda ¡Heartbeat cliente <-> servidor!

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Ayuda ¡Heartbeat cliente <-> servidor!

Notapor mjimenez » 2009-02-12 22:39 @986

Hola, llevo una semana con esto y no logro sacarlo adelante, libros y libros, y ejemplos y ejemplos pero nada...

El código es una implementación a un proceso cliente servidor que no está corriendo como debiera; el soporte del producto parece que hace oídos sordos, por lo que estoy decidido a crear un script en Perl que permitiese controlar las anomalías de su comportamiento (cuelgues inesperados y por tanto reinicio de las plataformas)... para ello tengo este código montado... pero...

No me sale, no me sale...

Esta es la secuencia de pseudo código que me he creado...


Leo de un fichero de logs (servicio.log), si la última línea es
Código: Seleccionar todo
"waiting for connect your client to Main server"

es que está corriendo, no hago nada; si leo comunicación perdida
Código: Seleccionar todo
Connection lost with the Main Server at Fri Oct 10 09:44:3

entonces reinicio Client Server.


1. Cada 5min chequeo dentro del fichero servicio.log si tengo en la última línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$ready = "waiting for connect your client to Main server"
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


si contiene $ready, hago una INSERT en eventos en mi base de datos local, añado ID, TEXT, NODO, TTIME
Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
INSERT INTO eventos (ID, TEXT, NODO, TTIME) VALUES ( DEFAULT autoincrement, "cliente ok", NODO_1, TTIME);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


$my contiene
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$contiene = SELECT FETCH SQL

if ($contiene =~ /waiting for connect/)
{ print ("Estoy corriendo") exit;}
else { kill $SERVER_PID  }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y salgo del proceso.

Si por el contrario la última línea del log (servicio.log) contiene.
Código: Seleccionar todo
Connection lost with Main Server at Fri Oct 10 09:44:3

entonces reinicio Cliente -> grabando a fichero LOG de reinicio con hora de reinicio.

Al minuto puede darse la condición de que se restablezca:
Puedo leer en el log:
Código: Seleccionar todo
Connection restablished with Main Server at Tue Feb 03 13:34:08 CET 2009


¿¿CÓMO ACTUO?? ¿Grabo en un fichero que estoy Ok? ¿Mando al servidor principal que reinicie el nodo cliente?

Y salgo


2. Chequeo Main Server, miro: /opt/logs/servicio.log
Si contiene en la última línea
Código: Seleccionar todo
Connect your client to Main Server

esta corriendo perfectamente no hago nada -> SALGO

Recojo la información recibida de los nodos clientes...

{FALTARÍA IMPLEMENTAR UN INTERVALO DE TIEMPO DE RECEPCIÓN}

Envió a las 10:05 -> ¡¡Debo haberlo recibido a las 10:07 máximo!!
10:10 -> Debo haberlo recibido a las 10:12...


Si mensaje contiene "No response from the Primary Server as it may not be running" lanzo por protocolo RSH un kill del $Cliente_PID.

Si contiene "waiting for connect" no hago nada y salgo...


....

A ver si alguien puede echarme una mano, prometo esforzarme e involucrarme más en crear scripts con Perl, veo que es muy potente y puede crear muchas cosas...

Gracias por leeros este tocho ;)
A ver si puedo aprender de vosotros y a la vez dar ejemplo a otros que se encuentren en situación parecida ¡Un saludo!
mjimenez
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2008-12-12 10:01 @459

Publicidad

Notapor Sombrerero_Loco » 2009-02-18 12:01 @542

Hola.

Intenta sintetizarlo un poco más... para que podamos ver en líneas generales qué es lo que quieres hacer...

Sé que es difícil, yo mismo estaba en tu tesitura hace 2 meses... pero con esfuerzo y dedicación sale.

A lo mejor si lo sintetizas mejor, podemos darte una "guía" para que ya sepas qué procesos lógicos de Perl debes de ir implementando para poder construir tu script.

Eso sí, si es tu primer script, prepárate, porque lo que quieres te va a llevar tiempo esta primera vez.

¡ Un saludo !


EDITO: he vuelto a releer tu mensaje y creo que te estás liando.

Perl no te permite "tener una aplicación corriendo", es algo que se ejecuta cada vez que es invocado. Es interpretado no compilado.

Lo que tienes que hacer es programar un cron (entiendo por lo que pones que funcionas en *nix) para que cada 5 minutos se ejecute el script.
Este debería:

Código: Seleccionar todo
Abro fichero de log
  busco cadena XXXX
   Si encuentro cadena XXX: hago esto
     Escribo fichero de log
     Con datos que quiero
   Si encuentro cadena YYY: hago esto
     Hago insert a BD con datos de log

Escribo todo a log
cierro log
exit


¿Algo así podría ser?
Sombrerero_Loco
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2008-11-11 11:20 @514

Notapor mjimenez » 2009-02-19 02:47 @158

Hola sombrerero, ;)

Ante todo, gracias por responder.

Creo que todo puede ser más sencillo que todo esto, pero en todo caso, el flujo puede ser el siguiente:

Esclavos Abro log, si leo conexión cortada -> lanzo reiniciaproceso.sh
sino mando sql cada 5 min al maestro.

Maestro: abro log, abro sql y escribo en el log varias cosas:
1. que me llega correctamente el sql de cada nodo
si es así todo correcto no hago nada, todo ok
2. leo el estado del log y veo que todo está correcto (si me aparece log con conexión cortada mato mi server y mando señal remota a clientes para que se reinicien) espero un tiempo hasta que tanto maestro como clientes están reiniciados y espero las SQL de los clientes.


En todo caso, si alguien lee este post, he escrito una oferta de trabajo en jobs.perl.org

http://jobs.perl.org/job/10246

Agradecería (monetariamente) la ayuda.

Un saludo
mjimenez
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2008-12-12 10:01 @459

Notapor Sombrerero_Loco » 2009-02-19 03:57 @206

¡Hola!

¡De nada por responder!

Te cuento... hasta donde yo sé, debes de crear dos scripts, uno que sea el esclavo como dices y otro el maestro.

O puedes hacerlo todo en uno...

Éste podría ser el esclavo y el maestro... o los dos a la vez.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$ficherolog = "ficherolog.log";
$ficherolectura = "ficherolectura.log";
@dbcnx_datos = ('DBI:Oracle_O_SQL_O_EL_TIPO_DE_BASE:BASE_DE_DATOS', 'USUARIO', 'PASSWORD');       #Preparamos datos de acceso a la BD
$dbcnx_do = DBI->connect(@dbcnx_datos) or die "no se ha podido conectar con la BD, revisa la conexión!\n";#conectamos a la bd


open (FICHEROLECTURA, "<$ficherolectura");
while (<FICHEROLECTURA>) {
$flag = 1;                                                                                        #Buscamos lo que contenga esa mas lo que sea detras
        if (/Connection lost with the Main Server at(.+?)/) {                                         #como la fecha, hora, etc...
        $flag = 2;
        }

}

if ($flag == 1) {                                                                                 #esto ejecuta el script en caso de que si haya fallado
 REINICIAS EL SERVICIO EJECUTANDO UN SCRIPT KSH
}
else {                                                                                            #esto se conecta a la BD en caso de que NO haya
        $sql1_datos = qq((QUERY DE SQL HA HACER));                                                    #fallado.
        $sth1_do = $dbcnx_do->prepare($sql1_datos) or die "No he podido ejecutar la sentencia\n";
        $sth1_do->execute or die "No se ha podido conectar a la BD y ejecutar la sentencia\n";
}

$dbhcnx_do-> disconnect();                                                                                                                                                 #cerramos la conexion a la db
close FICHEROLECTURA;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Este sería el esclavo y el maestro, como ves los dos hacen lo mismo, miran un log, si encuentran algo, hace una cosa, sino hacen otra y escriben datos de nuevo a la BD.

Por eso se podría hacer en un solo script, que mirara primero en la bd a ver si existen datos, si no existen datos (ejecutando una query con variables de tiempo, por ejemplo), lee el fichero de log, si está que se cayó, reinicias el servicio ejecutando el script, si no, escribes en la BD que en ese momento el servicio estaba ok.

¡Espero que te sirva!
Sombrerero_Loco
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2008-11-11 11:20 @514

Notapor mjimenez » 2009-02-19 10:37 @484

Lo pondré en práctica, pero creo que es un buen comienzo para una base y luego irle añadiendo más cositas...
Como añadir las insert into tabla para que fluyan, y lo reciba desde el otro lado... esto se complica.

Tiene buena pinta, ya te contaré, porque seguro que me surgen dudas. ¡Muchas gracias!
mjimenez
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2008-12-12 10:01 @459

Notapor Sombrerero_Loco » 2009-02-19 10:45 @489

Hombre... si sabes de SQL es necesario solo metérselo en la query que quieres que ejecute si cumple una determinada condición.

Si la cumple metes un INSERT en la tabla XXX; si no, no hagas nada.

Ya ahí es más tema de SQL que de otra cosa...

¡Suerte!
Sombrerero_Loco
Perlero nuevo
Perlero nuevo
 
Mensajes: 42
Registrado: 2008-11-11 11:20 @514


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 32 invitados

cron