• Publicidad

Interpretar la salida de un comando

¿Eres administrador de sistemas? Este foro es para todos aquellos temas relacionados con el uso de Perl para administración de sistemas.

Interpretar la salida de un comando

Notapor erjuak » 2013-09-05 10:59 @499

¡Hola!

Al lanzar el comando:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
/etc/init.d/mysql status
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service mysql status

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the status(8) utility, e.g. status mysql
mysql start/running, process 25274
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Me gustaría interpretar la frase "mysql start/running, process 25274".

Lo estoy intentando así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use IPC::Open3;
  4. my $comando = "/etc/init.d/mysql status";
  5. my $info;
  6. open3( "</dev/null", ">/dev/null", \*ERPH, "$comando" ) or die "No puedo lanzar el mysql";
  7. my @res = <ERPH>;
  8. foreach (@res)
  9. {
  10.         if (m!mysql start/running, process ([0-9][0-9][0-9][0-9][0-9])!)
  11.         {
  12.                 $info = $1;
  13.                 print "El pid es:$info\n";
  14.         }
  15.     else
  16.     {
  17.     }
  18. }
  19.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Al ejecutar el script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. # ./mata_proceso.pl
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

No sale nada.

La cuestión es que necesito mas que sacar el pid. Necesito interpretar el texto de la salida del comando, ya que según la salida de este comando, me gustaría hacer alguna cosa u otra.

¿¿Alguien me podría echar una mano??

Muchas gracias.
erjuak
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2013-03-07 11:52 @536

Publicidad

Re: Interpretar la salida de un comando

Notapor explorer » 2013-09-05 11:33 @523

A mi me sale una cosa distinta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
# /etc/init.d/mysql status
/usr/bin/mysqladmin  Ver 8.42 Distrib 5.5.30, for debian-linux-gnu on x86_64
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version          5.5.30-1-log
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /var/run/mysqld/mysqld.sock
Uptime:                 16 days 12 hours 54 min 0 sec

Threads: 40  Questions: 1243432051  Slow queries: 1608  Opens: 23488  Flush tables: 1  Open tables: 5465  Queries per second avg: 870.238.
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
El PID lo puedo sacar del directorio donde se guardan los PID:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
# cat /var/run/mysqld/mysqld.pid
31719
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

En cuanto a interpretar tu salida, creo que se puede hacer de forma más sencilla:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5. use autodie;
  6.  
  7. my $pid;
  8.  
  9. open my $CMD, '-|', '/etc/init.d/mysql status';       # ejecutamos el comando y leemos lo que nos devuelve
  10. while (<$CMD>) {
  11.     chomp;
  12.  
  13.     if (m!^mysql start/running, process (\d+)!) {     # si la línea coincide con el patrón
  14.         $pid = $1;                                    # nos quedamos con la cantidad
  15.         last;                                         # y terminamos el bucle, no hace falta mirar más
  16.     }
  17. }
  18. close $CMD;
  19.  
  20. if ($pid) {
  21.     print "Encontrado PID de mysql: [$pid]\n";
  22. }
  23. else {
  24.     print "No hay PID para mysql.\n";
  25. }
  26.  
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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Interpretar la salida de un comando

Notapor erjuak » 2013-09-06 05:51 @285

¡¡Gracias, explorer!! Eso justamente es lo que quería:

Sobre el mensaje de mysql, es el que me canta un mysql-server que tengo instalado aquí en mi Ubuntu 12.04 del trabajo... para versiones...

Al final, voy a seguir con el script y me piden aquí en el trabajo que lo pase a Bash... (en fin)

De todas formas, me ha venido muy bien porque he aprendido bastante sobre como interpretar. De todas formas si no te importa hacerte una pregunta:

En la linea:
open my $CMD, '-|', '/etc/init.d/mysql status';

Primeramente, no entiendo cómo esta línea ejecuta el mysql... y segunda duda... ¿¿¿ porqué el signo '-|' ???

De verdad, muchas gracias por la contestación, así da gusto aprender Perl. :D :D
erjuak
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2013-03-07 11:52 @536

Re: Interpretar la salida de un comando

Notapor explorer » 2013-09-06 07:05 @337

Lo de los caracteres '-|' tiene que ver con las redirecciones, que seguro que habrás usado en bash:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. /etc/init.d/mysql status | perl programa.pl
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

solo que aquí, se encarga de hacerlo el propio open(). Lo que hace es ejecutar el comando, y entubar la salida de ese comando hacia nuestro programa Perl.

Anteriormente, en Perl, se podía escribir también así:

open(CMD, '/etc/init.d/mysql status |');

con lo que quedaba más claro su semejanza con una redirección bash. Lo que se hace ahora es unificar los caracteres de redirección, poniéndolos en el segundo argumento de open(). Así, no hay que acordarse de si un signo va a la derecha o a la izquierda del nombre del ejecutable.

En perldoc -f open está más explicado.

Un módulo de Perl que se suele usar para tareas de administración, es Sysadm::Install. Tiene funciones muy interesantes.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Administración

¿Quién está conectado?

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