[Perl] Re: Problemita

Mauricio Herrera Cuadra arareko en yahoo.com
Jue Abr 20 12:40:18 CDT 2006


oorales, cuanto perl! jajaja

simplificando el script original, ejecuta desde el shell:

(ps aux | grep USUARIO | awk '{ print $2 }') | xargs kill -9

saludos,
mauricio.

--- perl-request en tlali.iztacala.unam.mx wrote:
> 
> Ariel E. Pedrozo - Sysadmin dijo [Wed, Apr 19, 2006 at 06:55:01PM
> -0300]:
> >    Hola lista como andan ? tanto tiempo.... tengo un problemita y me
> gustaria
> >    saber su opinion...
> > 
> >    tengo en uno de mis server linux corriendo sistemas bajo cobol, y
> hay
> >    algunos usuarios que quedan con la sesion colgada entonces hay que
> >    matarlos de forma manual por el PID, para hacerlo mejor hice un
> peque�o
> >    script pero nose porque hay veces que funciona y otras veces no....
> este
> >    es el codigo, si me dan una mano bien agradecido estare.
> > 
> >    #!/usr/bin/perl
> > 
> >    print "Introduzca nombre de usuario :";
> >    $user = <STDIN>;
> > 
> >    system("ps auxw | grep $user | awk '{print $2}' > matar.txt");
> > 
> >    open(PID, "< matar.txt");
> >    @matar =<PID>;
> > 
> >        foreach $amatar (@matar){
> >            system("kill -9 $amatar");
> >        }
> > 
> >    close (PID);
> 
> Hola,
> 
> Dejando de lado que este problema s�lo evidenc�a que hay problemas
que
> te _urge_ resolver en tus sistemas Cobol si no quieres tener una
> preciosa corrupci�n de datos o algo por el estilo, hay varios
> detallitos a corregir en tu script.
> 
> El primero es que te est�s complicando a lo b�rbaro - Intenta lo
> siguiente:
> 
> # killall -u usuario
> 
> y ya con eso :)
> 
> Pero sigo corrigiendo detalles: Si grabas la salida de tu comando en
> un archivo de nombre fijo y luego lees ese archivo para limpiar la
> tabla de procesos, te abres a una preciosa condici�n de carrera -
�Qu�
> pasa si corres dos instancias del script exactamente a la vez? Bueno,
> como tanto system() como open() son llamadas al sistema, es muy
> probable que haya un cambio de proceso en ejecuci�n justo en ese
> punto, con lo que 'matar.txt' puede variar entre una l�nea y la
> siguiente. Si vas a hacer esto, mejor usa un m�dulo como File::Temp
> para abrir archivos aleatorios. As�mate al manual de File::Temp, viene
> con la distribuci�n est�ndar de Perl.
> 
> Ahora, para evitar estar abriendo manualment el archivo, �por qu� no
> capturar directamente los contenidos y re-procesar a patita separando
> las l�neas, cuando puedes usar las comillas inversas? Substituye por:
> 
> @lineas = `ps auxw | grep $user | awk '{print $2}'`;
> 
> Mejor a�n, Perl est� hecho justo para casos como el que describes -
Es
> m�s f�cil -y mucho m�s eficiente- hacer esto dentro del mismo Perl
que
> invocar a dos comandos de shell que lo hagan... Mejor:
> 
> @lineas = `ps auxw`;
> foreach $amatar @matar {
>     @data = split /\s*/ $amatar;
> 
>     # evita que encuentre un proceso que se llame igual que tu
>     # usuario: Busca s�lo en $data[0]
>     next unless $data[0] eq $user; 
> 
>     system("kill $amatar");
> }
> 
> Y habr�s observado que no le puse 'kill -9', sino simplemente
> kill. Puede sonar tentador decirle "mu�rete, no me importa lo que
> pase", pero eso muchas veces te va a dejar el proceso en un triste
> estado de descomposici�n que -nuevamente- te llevar� a la
corrupci�n
> de datos.
> 
> Y si quieres terminar de hacer esto de una manera m�s limpia y
> perlosa (y evitar nuevamente lanzar un comando que necesitas), en vez
> de interrogar a trav�s de 'ps auxw' puedes usar un m�dulo como
> Proc::Pid::File o Proc::Process.
> 
> Saludos,
> 
> -- 
> Gunnar Wolf - gwolf en gwolf.org - (+52-55)5623-0154 / 1451-2244
> PGP key 1024D/8BB527AF 2001-10-23
> Fingerprint: 0C79 D2D1 2C4E 9CE4 5973  F800 D80E F35A 8BB5 27AF
> 


--
MAURICIO HERRERA CUADRA
mauricio en arareko.net
http://www.arareko.net/

__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 


Más información sobre la lista de distribución Perl