• Publicidad

Conocer el PID del proceso que lanzo

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

Conocer el PID del proceso que lanzo

Notapor David_Guillen » 2010-03-05 10:20 @472

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
David_Guillen
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-02-10 12:14 @551

Publicidad

Re: Conocer el PID del proceso que lanzo

Notapor explorer » 2010-03-05 11:23 @516

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:
Sintáxis: [ Descargar ] [ Ocultar ]
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'
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

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 & 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: Conocer el PID del proceso que lanzo

Notapor David_Guillen » 2010-03-05 13:38 @610

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:

Sintáxis: [ Descargar ] [ Ocultar ]
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; }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Muchas gracias de nuevo
David
David_Guillen
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-02-10 12:14 @551

Re: Conocer el PID del proceso que lanzo

Notapor explorer » 2010-03-05 14:40 @652

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 & 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: Conocer el PID del proceso que lanzo

Notapor salva » 2010-03-06 03:17 @178

David_Guillen escribiste: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:

Sintáxis: [ Descargar ] [ Ocultar ]
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.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680

Re: Conocer el PID del proceso que lanzo

Notapor David_Guillen » 2010-03-09 14:47 @657

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... :-)
David_Guillen
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-02-10 12:14 @551

Re: Conocer el PID del proceso que lanzo

Notapor David_Guillen » 2010-03-10 07:24 @350

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:
Sintáxis: [ Descargar ] [ Ocultar ]
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++;
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


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
David_Guillen
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-02-10 12:14 @551

Re: Conocer el PID del proceso que lanzo

Notapor explorer » 2010-03-10 08:28 @394

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),
Sintáxis: [ Descargar ] [ Ocultar ]
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";
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Pero bueno, se puede hacer de muchas maneras. Y si la tuya funciona, pues adelante.
Última edición por explorer el 2010-03-11 13:45 @614, editado 1 vez en total
Razón: @group => @output
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: Conocer el PID del proceso que lanzo

Notapor David_Guillen » 2010-03-11 13:40 @611

hola Explorer

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

Sintáxis: [ Descargar ] [ Ocultar ]
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.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


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
David_Guillen
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2010-02-10 12:14 @551

Re: Conocer el PID del proceso que lanzo

Notapor explorer » 2010-03-11 14:01 @626

En efecto, había un error en el código mío. Ya está cambiado.
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


Volver a Básico

¿Quién está conectado?

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

cron