Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Básico » Conocer el PID del proceso que lanzo  RESUELTO Responder al tema
Nuevo tema


Página 1 de 1  [ 10 mensajes ] 
 
Nota Vie Mar 05, 2010 10:20 am

Perlero Nuevo
Registrado: Mié Feb 10, 2010 12:14 pm
Mensajes: 6
Conocer el PID del proceso que lanzo
Hola a todos.

Dentro de mi script de Perl ejecuto un comando de la consola de Linux:

system (ls); #por ejemplo

Y quiero conocer el PID del proceso que acabo de lanzar. He probado con:

my $pid = system (ls);

Y no me funciona (me devuelve 0). También con open3 y no me lo reconoce. Muchas gracias por vuestra ayuda.

Un saludo.

PD. Estoy en Linux Ubuntu y Perl, v5.10.0 built for i486-linux-gnu-thread-multi Copyright 1987-2007, Larry Wall


Nota Vie Mar 05, 2010 11:23 am
Avatar de Usuario
Administrador
Registrado: Dom Jul 24, 2005 6:12 pm
Ubicación: Valladolid, España
Mensajes: 9492
Re: Conocer el PID del proceso que lanzo  RESUELTO
Salvo algún otro comentario, no lo puedes saber: system() ejecuta el comando, pero no regresa hasta que éste termine, así que no podemos saber el PID del proceso en ese momento, porque el proceso ya terminó.

system() no devuelve el PID, sino el resultado de la ejecución.

Sí que podríamos saber el PID si lanzáramos el proceso en segundo plano (background) -con '&' al final del comando, por ejemplo-, y mirando la tabla de procesos del sistema, pero, atención: esos procesos serán hijos del proceso padre de todo el sistema (el 1), ya que les hemos lanzado de esa manera. Si conoces sus nombres, entonces ya lo tienes todo.

Otra forma de lanzar procesos es entubando sus salidas o entradas hacia/desde nosotros (algo parecido a lo que ya hace open3).

Pero lo principal: system(ls) solo regresa cuando 'ls' termina. Mientras, tu programa Perl queda 'congelado'.

Un ejemplo en Perl lineal:
Syntax: [ Download ] [ Hide ]
Using bash Syntax Highlighting
perl -le '$cmd = "sleep 200"; system("$cmd \&"); $proceso = (grep { / $cmd$/ } qx(ps --ppid 1 -o "ppid,pid,cmd"))[-1]; ($pid) = $proceso =~ /(\d+) $cmd/; print $pid'

Aquí, estamos ejecutando el comando sleep 200 en segundo plano. Luego, sacamos la lista de procesos que se llamen igual y que su padre sea el '1', y nos quedamos con el último ([-1]) de ellos. Y de él, pintamos su PID.

Se podría mejorar añadiendo a la selección hecha por ps que el usuario efectivo (euser) sea el que ejecutó el programa Perl.

_________________
JF^D Perl programming


Nota Vie Mar 05, 2010 1:38 pm

Perlero Nuevo
Registrado: Mié Feb 10, 2010 12:14 pm
Mensajes: 6
Re: Conocer el PID del proceso que lanzo
Muchas gracias, explorer.

La idea era ejecutar el comando en segundo plano así que me voy a decantar por la idea de buscar el proceso por nombre.

He probado con un fork(); funciona, aunque mi solución es bastante chapucera:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
$id = system ("java net.tinyos.tools.Listen -comm serial\@$serialUSB[$i+3]:115200 > outputs/DNPv2_DATA &");
$pid = fork();
if ($pid == 0) {}
else { $u = $pid-4; print $u; }


Muchas gracias de nuevo
David


Nota Vie Mar 05, 2010 2:40 pm
Avatar de Usuario
Administrador
Registrado: Dom Jul 24, 2005 6:12 pm
Ubicación: Valladolid, España
Mensajes: 9492
Re: Conocer el PID del proceso que lanzo
Chapucera... no tiene porqué...

Lo que sí sería bonito es que usaras el módulo Device::USB con la librería libusb.

_________________
JF^D Perl programming


Nota Sab Mar 06, 2010 3:17 am
Avatar de Usuario
Perlero Frecuente
Registrado: Jue Ene 03, 2008 3:19 pm
Mensajes: 175
Re: Conocer el PID del proceso que lanzo
David_Guillen escribió:
He probado con un fork(); funciona, aunque mi solución es bastante chapucera:
...

¡Cuando menos es original!

La forma correcta de hacerlo es con fork y exec:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. my $pid = fork;
  2. unless ($pid) {
  3.   die "imposible crear proceso hijo" unless defined $pid;
  4.   { exec "java net.tinyos.tools.Listen -comm serial\@$serialUSB[$i+3]:115200 > outputs/DNPv2_DATA" };
  5.   warn "la llamada al sistema exec fallo";
  6.   POSIX::_exit(-1);
  7. }
  8. # el proceso padre sigue aquí...
  9.  


Nota Mar Mar 09, 2010 2:47 pm

Perlero Nuevo
Registrado: Mié Feb 10, 2010 12:14 pm
Mensajes: 6
Re: Conocer el PID del proceso que lanzo
Muchas gracias por vuestros consejos, me he decantado por la opción de buscar el PID por nombre de proceso, pero también me ha gustado la opción fork-exec. Le veo futuro... :-)


Nota Mié Mar 10, 2010 7:24 am

Perlero Nuevo
Registrado: Mié Feb 10, 2010 12:14 pm
Mensajes: 6
Re: Conocer el PID del proceso que lanzo
Bueno os dejo aquí el script que utilizo para obtener el nombre del PID del proceso cuyo nombre conozco (en mi caso porque lo ejecuto yo) y posteriormente acabar con él.
La sintaxis del programa puede no ser muy perlera (un grep() sería más cómodo que el while() ), pero es muy fácil de entender:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
$p_name = #Nombre del proceso;
$output = `ps a`; #Comando Linux para listar todos los de usuario
@output = split (/\s/,$output);
print "\n Buscando $p_name entre los procesos";

$n=0;
while ($n<=$#output)
{
    if (@output[$n] =~ /$p_name/)
    {
        print "\n\n Proceso coincidente con $p_name";
        print "\n PID: $output[$n-13]"; #Dependiendo del formato de ps puede que haya que ajustar el valor (en mi caso el PID está en -13)
        system ("kill -9 $output[$n-13]");
    }
    $n++;
}


Y con esto doy por resuelta esta duda (por supuesto, si nadie tiene nada más que aportar). Muchas gracias a todos por vuestra ayuda.

David


Nota Mié Mar 10, 2010 8:28 am
Avatar de Usuario
Administrador
Registrado: Dom Jul 24, 2005 6:12 pm
Ubicación: Valladolid, España
Mensajes: 9492
Re: Conocer el PID del proceso que lanzo
Pues perlera es... porque si funciona, desde luego es que está escrito en Perl.

Otra cosa es @output[$n]. Aunque funcione y es correcto, lo más correcto es poner $output[$n], ya que estás queriendo obtener un solo elemento del arreglo @output.

Lo del -13 no me gusta nada: si un día cambia la forma de trabajar de ps, puedes tener problemas (sí, ya sé que es imposible que eso suceda).

Sería mejor procesar cada línea por separado.

Por ejemplo (no probado),
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
$p_name = 'ps';      # Nombre del proceso;
@output = qx(ps a);  # Comando Linux para listar todos los de usuario
@output = grep { /$p_name/ } @output;
print "\n Buscando $p_name entre los procesos: ";
if (@output) {
    for (@output) {
        my @campos = split;
        print "\n\tProceso coincidente con $p_name con PID:[$campos[0]]";
        system ("kill -9 $campos[0]");
    }
}
else {
    print "No se encontró ninguno.";
}
print "\n";
 

Pero bueno, se puede hacer de muchas maneras. Y si la tuya funciona, pues adelante.

_________________
JF^D Perl programming


Última edición por explorer el Jue Mar 11, 2010 1:45 pm, editado 1 vez en total
@group => @output


Nota Jue Mar 11, 2010 1:40 pm

Perlero Nuevo
Registrado: Mié Feb 10, 2010 12:14 pm
Mensajes: 6
Re: Conocer el PID del proceso que lanzo
hola Explorer

Me funciona cambiando el orden de las cadenas del 'grep' (puesto que luego se evalúa @output).

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #! usr/bin/perl
  2.  
  3. $p_name = 'ps';      # Nombre del proceso;
  4. @output = qx(ps a);  # Comando Linux para listar todos los de usuario
  5. @output = grep { /$p_name/ } @output;
  6. print "\n Buscando $p_name entre los procesos: ";
  7. if (@output) {
  8.     for (@output) {
  9.         my @campos = split;
  10.         print "\n\tProceso coincidente con $p_name con PID:[$campos[0]] en @campos";
  11.     }
  12. }
  13. else {
  14.     print "No se encontró ninguno.";
  15. }
  16. print "\n";
  17.  


Esta forma que me propones me parece más inteligente y robusta frente a posibles variaciones del comando 'ps a'. Ya la he adoptado

Saludos


Nota Jue Mar 11, 2010 2:01 pm
Avatar de Usuario
Administrador
Registrado: Dom Jul 24, 2005 6:12 pm
Ubicación: Valladolid, España
Mensajes: 9492
Re: Conocer el PID del proceso que lanzo
En efecto, había un error en el código mío. Ya está cambiado.

_________________
JF^D Perl programming


Responder al tema  [ 10 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO