• Publicidad

Contador de peso de archivos en ejecución

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

Contador de peso de archivos en ejecución

Notapor haganex » 2012-10-17 16:42 @737

Chicos, recurro a ustedes nuevamente ya que tengo que hacer una tarea en la universidad y estoy algo complicado. Dejo escrito lo que tengo que hacer:

Escriba un programa en Perl que reciba dos parámetros:
- un nombre de usuario
- un pid (opcional)

El sistema debe mostrar la cantidad de memoria total que ocupan los procesos que le pertenecen al usuario.

Si es ingresando el pid, solo se debe mostrar la memoria total de los procesos que son hijos del pid ingresado.

He recorrido el archivo passwd para ver primero si existe el usuario y ver su pid pero el tema es que no sé de dónde obtener la información o peso de cada archivo en ejecución perteneciente al usuario que llegó por parámetro.

Espero me puedan ayudar.

¡ Saludos !
haganex
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2012-08-25 08:15 @385

Publicidad

Re: Contador de peso de archivos en ejecución

Notapor explorer » 2012-10-17 21:03 @918

Esta es una posible solución.

La explicación del funcionamiento se deja como ejercicio.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3. #use strict;             # solo para desarrollo
  4. #use warnings;           # solo para desarrollo
  5. #use diagnostics;        # solo para desarrollo
  6.  
  7. ## Constantes
  8. my @tamanos  = qw(reservado total virtual);    # los tamaños que vamos a informar
  9. my $ps_sizes = 'rss,size,vsize';               # sus correspondientes nombres para 'ps'
  10.  
  11. ## Argumentos
  12. @ARGV > 0
  13.     or die "Uso: $0 <nombre de usuario> [<pid proceso padre>]\n";
  14.  
  15. ## Nombre de usuario
  16. my $usuario = shift;
  17.  
  18. ## Obtenemos la lista de procesos del usuario
  19. my @procesos = qx(ps h --User $usuario -o pid,$ps_sizes);
  20.  
  21. ## Transformamos los @procesos, de cadenas de caracteres,
  22. ## a un hash de arrays, siendo
  23. ##    clave: el PID de cada proceso
  24. ##    valor: un array con los tamaños
  25. my %procesos
  26.     = map {
  27.         my @c = split;
  28.         $c[0] => [ @c[1..3] ];
  29.     } @procesos;
  30.  
  31. ## ppid que tenemos que analizar
  32. my $ppid = shift // '';                                 # el pid del proceso padre,
  33.                                                         # indicado por el usuario
  34. ## ver qué pids tenemos que analizar
  35. my @pids = keys %procesos;                              # por defecto, todos
  36.  
  37. if ($ppid) {                                            # si tenemos un pid padre
  38.     my @procesos_ppid = qx(ps h --ppid $ppid -o pid);   # vemos sus procesos hijo
  39.  
  40.     @procesos_ppid = map { split } @procesos_ppid;      # quitamos los posibles espacios en blanco
  41.  
  42.     @pids = grep { $_ ~~ @procesos_ppid } @pids;        # filtramos: nos quedamos solo con los pid
  43.                                                         # que sean hijos del proceso padre
  44. }
  45.  
  46. ## Hacemos las sumas
  47. my @sizes;
  48.  
  49. for my $pid (@pids) {
  50.     $sizes[$_] += $procesos{$pid}[$_] for 0 .. $#tamanos;
  51. }
  52.  
  53. ## Informamos
  54. say "El usuario [$usuario] tiene ", scalar(@procesos), " procesos.";
  55. if ($ppid) {
  56.     say "Filtrando los procesos hijos del proceso [$ppid], quedan ", scalar(@pids), " procesos.";
  57. }
  58. say "Ocupación de espacio de los procesos:";
  59.  
  60. while (my($i, $v) = each @tamanos) {
  61.     printf "Espacio %-10s: %d Kb\n", $v, $sizes[$i];
  62. }
  63.  
  64. __END__
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Ejemplo de salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@hs-1509:~/Desarrollo$ ./kk.pl explorer
El usuario [explorer] tiene 18 procesos.
Ocupación de espacio de los procesos:
Espacio reservado : 37252 Kb
Espacio total     : 56656 Kb
Espacio virtual   : 523808 Kb
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@hs-1509:~/Desarrollo$ ./kk.pl explorer 28476
El usuario [explorer] tiene 18 procesos.
Filtrando los procesos hijos del proceso [28476], quedan 10 procesos.
Ocupación de espacio de los procesos:
Espacio reservado : 12680 Kb
Espacio total     : 29056 Kb
Espacio virtual   : 240816 Kb
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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 26 invitados