Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

mytree.pl (pstree all unix)

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Vie May 11, 2007 8:53 am
javier_clv
Perlero Nuevo
Perlero Nuevo
Registrado: 11 May 2007
Mensajes: 3
mytree.pl (pstree all unix) Responder citando

Hola que tal, estoy tratando de hacer un script en que el resultado sea el mismo que arroja el comando pstree en Linux o ptree en Solaris.

La idea de armar un árbol de directorios es para otro script que no viene al caso detallarlo.

La cuestión es que buscando en internet no encontré ningún script en Perl similar por lo que me propuse a armarlo.

La idea es que sea compatible con (Linux, AIX, HP-UX, Solaris, Tru64, etc).

Va el script:
Perl:
#!/bin/perl

use strict;

# armo arbol de procesos
my @ProcessOS = qx(ps -ef);
my @estructura; #Array multidimensional, en este caso seria de 3d

foreach (@ProcessOS) {
        $_ =~ /[d*w*]s+(d*)s+(d*)s+d{1,5}s+[d*:*w*s+d{1,2}]*W{2}s+[d*:*]*s+([-*:*[*]*/*w*d*]*)s*/;
        push (@estructura, [$1, $2, $3]) if ($1);
}

my ($x,$y);
print '<table border="1">';

foreach $x (0..@estructura-1){
        print "<tr>n";
        foreach $y (0..@{$estructura[$x]}-1){
                print "<td> $estructura[$x][$y] </td>n";
        }
        print "</tr>nn";
}

print "</table>";


En este caso se guardan en el array de 3D los PID PPID CMD del OS.
Las dudas son 2.

Esta línea: push (@estructura, [$1, $2, $3]) if ($1);
¿Es optima? ¿Existe una más óptima?

Y por último, ¿a alguien se le ocurre un algoritmo para armar el árbol? Ya tenemos los datos pero si me dan una mano sería bueno.

Saludos
Mensaje Vie May 11, 2007 2:29 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
Responder citando

Lo primero:
Como sacas los procesos no me suena... sí ejecutas como root (el script) podés sacar los precesos por medio de /proc pero para tener un desarrollo rápido y más limpio usa Proc::ProcessTable
Mensaje Vie May 11, 2007 2:47 pm
Perl user
Maestro Honorario
Maestro Honorario
Registrado: 03 Nov 2004
Mensajes: 385
Re: mytree.pl (pstree all unix) Responder citando

javier_clv escribió:
Hola que tal, estoy tratando de hacer un script en que el resultado sea el mismo que arroja el comando pstree en Linux o ptree en Solaris.

La idea de armar un árbol de directorios es para otro script que no viene al caso detallarlo.

La cuestión es que buscando en internet no encontré ningún script en Perl similar por lo que me propuse a armarlo.

La idea es que sea compatible con (Linux, AIX, HP-UX, Solaris, Tru64, etc).

Va el script:
Perl:
#!/bin/perl

use strict;

# armo arbol de procesos
my @ProcessOS = qx(ps -ef);
my @estructura; #Array multidimensional, en este caso seria de 3d

foreach (@ProcessOS) {
        $_ =~ /[d*w*]s+(d*)s+(d*)s+d{1,5}s+[d*:*w*s+d{1,2}]*W{2}s+[d*:*]*s+([-*:*[*]*/*w*d*]*)s*/;
        push (@estructura, [$1, $2, $3]) if ($1);
}

my ($x,$y);
print '<table border="1">';

foreach $x (0..@estructura-1){
        print "<tr>n";
        foreach $y (0..@{$estructura[$x]}-1){
                print "<td> $estructura[$x][$y] </td>n";
        }
        print "</tr>nn";
}

print "</table>";


En este caso se guardan en el array de 3D los PID PPID CMD del OS.
Las dudas son 2.

Esta línea: push (@estructura, [$1, $2, $3]) if ($1);
¿Es optima? ¿Existe una más óptima?

Y por último, ¿a alguien se le ocurre un algoritmo para armar el árbol? Ya tenemos los datos pero si me dan una mano sería bueno.

Saludos


Qué tipo de "arbol" necesitas? o cuál es el concepto de "árbol" que utilizas para este contexto?

Saludos,
Mensaje Vie May 11, 2007 2:48 pm
javier_clv
Perlero Nuevo
Perlero Nuevo
Registrado: 11 May 2007
Mensajes: 3
Responder citando

Claro puedo usar el modulo Proc pero siempre y cuando lo ejecute como root y la idea es que todos los usuarios puedan ejecutar esto sin problemas, sin recurrir a modulos y/o setear SUID.

La idea es que este script arme de la salida del comando ps de unix un arbol de procesos.
En las primeras lineas ves que se hace qx(ps -ef) en unix te trae todos los proceso activos del sistema.
Este comando es utilizado por todos los users y de ahi se puede jugar con el script.

Igualmente agradezco tu respuesta y lo tendre en cuenta para proximos scripts.
De cualquier manera, se te ocurre algun modo de armar el arbol de proceso?
Si ejecutas este script tal cual esta en un linux o Unix este te arma un html donde veras como primer los PID, segundo campo PPID y por ultimo los CMD ejecutados.

La idea es que todos los PPID nacen de un PPID y cada PID y PPID tienen asociado un CMD.

Saludos!!!
Mensaje Vie May 11, 2007 2:52 pm
javier_clv
Perlero Nuevo
Perlero Nuevo
Registrado: 11 May 2007
Mensajes: 3
Re: mytree.pl (pstree all unix) Responder citando

Perl user escribió:
javier_clv escribió:
Hola que tal, estoy tratando de hacer un script en que el resultado sea el mismo que arroja el comando pstree en Linux o ptree en Solaris.

La idea de armar un árbol de directorios es para otro script que no viene al caso detallarlo.

La cuestión es que buscando en internet no encontré ningún script en Perl similar por lo que me propuse a armarlo.

La idea es que sea compatible con (Linux, AIX, HP-UX, Solaris, Tru64, etc).

Va el script:
Perl:
#!/bin/perl

use strict;

# armo arbol de procesos
my @ProcessOS = qx(ps -ef);
my @estructura; #Array multidimensional, en este caso seria de 3d

foreach (@ProcessOS) {
        $_ =~ /[d*w*]s+(d*)s+(d*)s+d{1,5}s+[d*:*w*s+d{1,2}]*W{2}s+[d*:*]*s+([-*:*[*]*/*w*d*]*)s*/;
        push (@estructura, [$1, $2, $3]) if ($1);
}

my ($x,$y);
print '<table border="1">';

foreach $x (0..@estructura-1){
        print "<tr>n";
        foreach $y (0..@{$estructura[$x]}-1){
                print "<td> $estructura[$x][$y] </td>n";
        }
        print "</tr>nn";
}

print "</table>";


En este caso se guardan en el array de 3D los PID PPID CMD del OS.
Las dudas son 2.

Esta línea: push (@estructura, [$1, $2, $3]) if ($1);
¿Es optima? ¿Existe una más óptima?

Y por último, ¿a alguien se le ocurre un algoritmo para armar el árbol? Ya tenemos los datos pero si me dan una mano sería bueno.

Saludos


Qué tipo de "arbol" necesitas? o cuál es el concepto de "árbol" que utilizas para este contexto?

Saludos,


La idea es armar algo parecido a un pstree en linux (esto tambien existe en solaris, pero se llama ptree el binario).

Por ejemplo la salida del comando pstree en linux es la siguiente, la idea del script mytree.pl es que haga lo mismo.

Código:
user1@Linux:~> pstree
init─┬─acpid
     ├─auditd───{auditd}
     ├─cron
     ├─cupsd
     ├─2*[dbus-daemon]
     ├─dcopserver
     ├─events/0
     ├─gconfd-2
     ├─hald───hald-runner─┬─hald-addon-acpi
     │                    ├─hald-addon-cpuf
     │                    └─hald-addon-stor
     ├─ifplugd
     ├─kbluetoothd
     ├─kded
     ├─kdeinit─┬─amarokapp─┬─ruby
     │         │           └─5*[{amarokapp}]
     │         ├─firefox───firefox-bin───10*[{firefox-bin}]
     │         ├─kate───bash
     │         ├─kio_file
     │         ├─klauncher
     │         ├─konqueror
     │         ├─konsole───bash───pstree
     │         └─kwin
     ├─kdesktop
     ├─kdesud
     ├─kdm─┬─Xorg
     │     └─kdm───startkde─┬─kwrapper
     │                      └─ssh-agent
     ├─khelper
     ├─kicker
     ├─kio_uiserver
     ├─klogd
     ├─kmix
     ├─knetworkmanager
     ├─knodemgrd_0
     ├─knotes
     ├─knotify
     ├─kpowersave
     ├─ksmserver
     ├─ksoftirqd/0
     ├─kthread─┬─aio/0
     │         ├─cqueue/0
     │         ├─kacpid
     │         ├─kauditd
     │         ├─kblockd/0
     │         ├─khpsbpkt
     │         ├─khubd
     │         ├─2*[kjournald]
     │         ├─kondemand/0
     │         ├─kpsmoused
     │         ├─kseriod
     │         ├─kswapd0
     │         ├─pccardd
     │         └─2*[pdflush]
     ├─migration/0
     ├─6*[mingetty]
     ├─nscd───6*[{nscd}]
     ├─polkitd
     ├─portmap
     ├─powersaved
     ├─resmgrd
     ├─smpppd
     ├─sshd
     ├─start_kdeinit
     ├─syslog-ng
     └─udevd
Mensaje Vie May 11, 2007 5:01 pm
creating021
Vive para Perl en Español
Vive para Perl en Español
Registrado: 23 Feb 2006
Mensajes: 498
Ubicación: Frente al monitor
Responder citando

javier_clv escribió:
Claro puedo usar el modulo Proc pero siempre y cuando lo ejecute como root y la idea es que todos los usuarios puedan ejecutar esto sin problemas, sin recurrir a modulos y/o setear SUID.

La idea es que este script arme de la salida del comando ps de unix un arbol de procesos.
En las primeras lineas ves que se hace qx(ps -ef) en unix te trae todos los proceso activos del sistema.
Este comando es utilizado por todos los users y de ahi se puede jugar con el script.

Igualmente agradezco tu respuesta y lo tendre en cuenta para proximos scripts.
De cualquier manera, se te ocurre algun modo de armar el arbol de proceso?
Si ejecutas este script tal cual esta en un linux o Unix este te arma un html donde veras como primer los PID, segundo campo PPID y por ultimo los CMD ejecutados.

La idea es que todos los PPID nacen de un PPID y cada PID y PPID tienen asociado un CMD.

Saludos!!!


Para poder hacer ese árbol tenes que saber el ppid (Parent Process ID)... creo que es mucho mejor usar el módulo.

Buscas el ppid de cada proceso y lo pones en un hash (proceso => ppid) y según eso imprimis el árbol.

Lo bueno del módulo es que soporta todo UNIX/Unix-Like y tiene muchas funciones.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group