• Publicidad

Guardar procesos en ejecución en un array o hash

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

Guardar procesos en ejecución en un array o hash

Notapor fgalves » 2006-10-30 10:41 @487

Hola a todos,

El caso es que estoy intentando implementar un script que se meta en un bucle y que no salga hasta que una serie de scripts no hayan terminado su ejecución. De momento, he implementado lo siguiente (que por cierto, no funciona para nada):


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#en $file_name tengo el path y el nombre del fichero a crear

open (F,">$flagFile") || die "ERROR: can't open $flagFile";
print STDOUT "Suspend all jobs: Flag File Created\n";

while (@processList = grep(/^Colorao/, 'ps -a'))
{
    print F "FqStats Processes turning:\n";
    print F @processList."\n";
}
close(F);
print STDOUT "There are no more Colorao processes currently running\n";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


El caso es que la condición dentro del while parece no funcionar. Lo que quiero hacer es que mientras haya procesos (scripts) Perl ejecutándose cuyo nombre empiece por "Colorao", pues que no salga del bucle, y de paso, escribir dicha lista de procesos en un fichero (esto último es opcional).
¿Alguien podría echarme una manita con la condición del bucle?
¿Cómo guardar el resultado del ps dentro de un array? ¿Qué es mejor, guardarlo en un array o en un hash?

¡¡Muchas gracias!!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Publicidad

Notapor explorer » 2006-10-30 12:00 @541

* Antes, haz la prueba de imprimir el valor del grep para ver si es correcto que es capaz de sacar los procesos Coloraos. Fíjate que has puesto '^' para indicar que aparece el nombre del proceso al comienzo de cada línea de 'ps -a'.

* Lo normal sería poner un tiempo de espera, dentro del bucle while, con el comando sleep, para no tener el ordenador saturado.

* A mí sí que me funciona el while (naturalmente adaptado el ps a mi Linux). Si el bucle while es correcto (hay procesos Coloraos), entonces estás imprimiendo continuamente una lista de esos procesos dentro del fichero. Lo ideal sería hacer un seek al principio del fichero para sobre escribirlo cada vez que se inicia el bucle.
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

Notapor fgalves » 2006-11-02 04:37 @234

Hola a todos,

De hecho, la opción "ps -aux" si me funciona (en el entorno de producción en el cual el script debe ser utilizado) y me da resultados del tipo:

Código: Seleccionar todo
.....
pepito  17459  0.0  0.3  42412 28084 pts/0    R+   09:17   0:00 perl ColoraoDai
pepito  17460  0.0  0.3  42412 28092 pts/0    R+   09:17   0:00 perl ColoraoDai
pepito  17461  0.0  0.3  42412 28092 pts/0    R+   09:17   0:00 perl ColoraoDai
pepito  17462  0.0  0.3  42412 28048 pts/0    R+   09:17   0:00 perl ColoraoDai
pepito  17463  0.0  0.0   3520   864 pts/1    R+   09:17   0:00 ps -aux
....


Donde:
- primera columna: USER (ej: pepito)
- segunda columna : PID (ej: 17459, ...)
...
- ultima columna: comando que fue lanzado (ej: perl ColoraoDai, ps -aux,....)

Lo que yo necesito es guardar en @processList, el nombre del comando o proceso (ultima columna), siempre y cuando empiece por "Colorao".

¿Alguien me puede echar una mano?
Explorer, he hecho lo que me dijiste y al imprimir el valor del grep, no había nada de nada en @processList.

Muchas gracias!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor explorer » 2006-11-02 05:30 @271

¿y qué código has usado?
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

Notapor fgalves » 2006-11-02 05:46 @282

Hola Explorer,

Pues el mismo codigo de antes pero algo modificado:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @processList;


############
### MAIN ###
############

#Blocking File Creation
open (F,">$blockingFile") || die "ERROR: can't open $blockingFile";
print STDOUT "Suspending all jobs: Blocking File Created on $blockingFile\n";
print STDOUT "Waiting for ending of Colorao running processes\n";

while (@processList = grep(/^Colorao/, 'ps -aux'))
{
    #makes the script to sleep 15 seconds
    sleep(15);
}
close(F);
print STDOUT "There are no more Colorao processes currently running\n";

exit 0;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor explorer » 2006-11-02 05:53 @287

El problema sigue estando en lo ya comentado antes: estás usando el indicador de principio de línea: '^'. Y las líneas que devuelve ps NO comienzan así, sino con el nombre de usuario. Quítalo.
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

Notapor fgalves » 2006-11-02 07:24 @350

Gracias por tu comentario Explorer.

El codigo modificado queda de la siguiente forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @processList;


############
### MAIN ###
############

#Blocking File Creation
open (F,">$blockingFile") || die "ERROR: can't open $blockingFile";
print STDOUT "Suspending all jobs: Blocking File Created on $blockingFile\n";
print STDOUT "Waiting for ending of Colorao running processes\n";

while (@processList = grep(/Colorao/, 'ps -aux'))
{
    #makes the script to sleep 15 seconds
    print F "@processList"."\n";
    sleep(15);
}
close(F);
print STDOUT "There are no more Colorao processes currently running\n";

exit 0;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



El caso es que tampoco asi parece funcionar. En un terminal, lanzo uno de los scripts "Colorao....pl", y mientras este todavia esta ejecutandose, en otro terminal lanzo el script que nos ocupa en este hilo. El script no se mete en el bucle y me imprime directamente:

Código: Seleccionar todo
Suspending all jobs: Blocking File Created on .......
Waiting for ending of Colorao running processes
There are no more Colorao processes currently running


Evidentemente hay un problema con la condicion del bucle, pues en @processList no hay nada de nada.

Haciendo un
Código: Seleccionar todo
ps -aux | grep Colorao

des del terminal, si me muestra correctamente la lista de procesos.

Alguien me puede echar una manita en la condicion del while?

Un saludo y muchas gracias a todos y en especial, a ti Explorer, por dedicarme tu tiempo,
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor fgalves » 2006-11-02 09:03 @419

Hola de nuevo,

He probado el siguiente codigo, modificando la condicion del bucle while:


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @processList;


############
### MAIN ###
############

#Blocking File Creation
open (F,">$blockingFile") || die "ERROR: can't open $blockingFile";
print STDOUT "Suspending all jobs: Blocking File Created on $blockingFile\n";
print STDOUT "Waiting for ending of FqStats running processes\n";


while (@processList = 'ps -aux | grep /FqStats/')
{
    #makes the script to sleep 15 seconds
    print F "@processList"."\n";
    sleep(15);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora si entra en el bucle, pues aparece el mensaje "Waiting for ending ...." y se queda en espera. El problema que tengo ahora es que se queda en el bucle indefinidamente (incluso cuando los scripts Colorao...pl han terminado de ejecutarse), y cuando termino la aplicacion con CRTL+C, el fichero (F) esta completamente vacio.

Alguien sabe en que me equivoco? Pq siempre es cierta la condicion del while? Puede ser que haya que reinicializar el array @processList a cada iteracion del bucle?

Muchas gracias!!!
Felipe
M
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor fgalves » 2006-11-02 09:18 @429

Hola de nuevo,

Me respondo a mi mismo ya que he ido imprimiendo en la pantalla el resultado del contenido de @processList:

No sale del bucle pq siempre encuentra el proceso 'ps a | grep Colorao', el mismo de la condicion del bucle:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
while (@processList = 'ps a | grep Colorao')
{
    #makes the script to sleep 15 seconds
    print STDOUT "@processList"."\n";
    print F "@processList"."\n";
    sleep(15);
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


A alguien se le ocurre como solucionar dicho problema?

Gracias!!!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor fgalves » 2006-11-02 09:56 @456

Hola de nuevo,

El caso es que ahora me doy cuenta de la gran tonteria que hice.
De hecho, en @processList, lo que tengo no es el resultado del ps de Unix, sino simple y llanamente el string "ps a | grep Colorao"....
De ahi que no saliera jamas del bucle.

Mi duda por lo tanto ahora es como conseguir meter en un array (o en un hash), el resultado de un "ps a" de Unix.

Gracias por vuestra ayuda, y disculpad mis mensajes anteriores, pues realmente no me di cuenta de la tonteria que estaba haciendo.

Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Siguiente

Volver a Básico

¿Quién está conectado?

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