• Publicidad

Problema con expresión regular

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

Problema con expresión regular

Notapor natxo » 2010-04-08 06:51 @327

Hola.

Quiero automatizar la creación de varios monitores de rendimiento en servidores Windows 2003/2008. En sí es fácil, pero una cosa no me sale. Con el comando logman.exe se pueden crear dichos monitores. Primero quiero ver si existe el monitor; para ello se ejecuta el comando:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
D:\>logman query

Collection                              Type                          Status
-------------------------------------------------------------------------------
System Overview                         Counter                       Stopped

The command completed successfully.
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El monitor 'System Overview' siempre está presente, es uno de muestra en Windows.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!perl

use warnings;
use strict;

my $perflogsdir = "d:\\perflogs" ;
my $wpkgdir = "\\\\server\\software\$\\wpkg\\perfmon";

# run logman query, parse output
open (LOGMANQUERY, "logman query |" ) or die "couldn' execute logman.exe: $!\n" ;

while ( my $line = <LOGMANQUERY>) {
    # skip blank lines
    next if $line =~ /^\s+$/ ;
    # skip line with slashes
    next if $line =~ /^-*$/;
    # skip logman query header
    next if $line =~ /^collection.*$/i;
    # skip system overview monitor
    next if $line =~ /^system overview.*$/i;
    # debug info
    print "$line\n";

    if ( $line =~ /^terminalserver.*Stopped$/ ) {
        print "perf monitor installed but not running...\n" ;
        print "attempting to start it now\n" ;
        `logman start terminalserversessions`;
        exit 0;
    }
    # if logman query returns terminalserversessions counter running exit - success
    elsif ( $line =~ /^terminalserversessions\s+counter\s+running$/i ) {
        print "perf monitor for terminal server session already installed and configured\n" ;
        exit 0;
    }
    else {
        print "perf monitor for term server sessions not configured, proceeding now ...\n" ;
        # install the perf monitor
        setperms();
        `logman create counter terminalserversessions -cf $wpkgdir\\configperflog.txt -f csv -max 10 -si 15 -v -o "$perflogsdir\\termserv.csv"` ;
    }
}
 
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


La función setperms() crea el directorio $perflogsdir y aplica unos permisos con setacl.exe; esa parte funciona, así que no hace falta ponerla aquí.

Mi problema es que si ejecuto el script, la primera vez funciona bien, se crea el monitor, se aplican los permisos. Al crearse el monitor si volvemos a ejecutar logman query vemos esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
D:\>logman query

Collection                              Type                          Status
-------------------------------------------------------------------------------
terminalserversessions                  Counter                       Stopped
System Overview                         Counter                       Stopped
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El monitor recién creado está parado. Aquí es donde tendría que funcionar el primer control del bucle if(), pero no lo caza. Algo no funciona con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ( $line =~ /^terminalserver.*Stopped$/ )
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
D:\>d:\Perl\bin\perl.exe c:\drv\test.pl
terminalserversessions                  Counter                       Stopped

perf monitor for term server sessions not configured, proceeding now ...
The command completed successfully.

perf monitor for term server sessions not configured, proceeding now ...
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Hay dos problemas aquí:
1. la expresión regular para desechar las líneas en blanco no funciona, por eso se ejecuta 2 veces la creación del monitor
2. la expresión regular que tendría que detectar que el monitor ya está instalado pero está parado tampoco funciona. He probado esta otra pero tampoco:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ( $line =~ /^terminalserversessions\s+Counter\s+Stopped$/ )
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Qué hago mal? :-)
saludos,
Natxo Asenjo
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos

Publicidad

Re: Problema con expresión regular

Notapor explorer » 2010-04-08 07:37 @359

Para las líneas en blanco, prueba con esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
next if $line =~ /^\s*$/ ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
next if $line =~ /^-*$/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

la cambiaría por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
next if $line =~ /^-+/;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y la
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
next if $line =~ /^collection.*$/i;
next if $line =~ /^system overview.*$/i;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
next if $line =~ /^(?:collection|system overview)/i;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En cuanto a /^terminalserver.*Stopped$/ lo único que se me ocurre es que existan \s después de Stopped.

Para asegurarte, cambia
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "$line\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

por
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "[$line]\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: problema con expresión regular

Notapor natxo » 2010-04-08 07:51 @369

Ya está, no hay que fiarse de lo que nos devuelvan los comandos de Microsoft :)

Después de
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
terminalserversessions                  Counter                       Stopped
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

hay espacio en blanco, y por eso no pillaba
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ( $line =~ /^terminalserversessions\s+Counter\s+Stopped$/ )
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Nadie me va a devolver esta hora...
saludos,
Natxo Asenjo
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos

Re: Problema con expresión regular

Notapor natxo » 2010-04-08 08:12 @383

En efecto, había espacio después de 'Stopped'. Voy a acostumbrarme a usar los corchetes para ver exactamente qué devuelven los comandos del sistema.

Esto es lo que devolvía, por cierto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[terminalserversessions                  Counter                       Stopped ]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Un espacio en blanco después de Stopped.

Gracias por tu ayuda, como siempre.
saludos,
Natxo Asenjo
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos


Volver a Básico

¿Quién está conectado?

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

cron