elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Ayuda con un script [PERL]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con un script [PERL]  (Leído 2,549 veces)
0uts1de

Desconectado Desconectado

Mensajes: 8


Might take your diamonds but I'll steal your heart


Ver Perfil
Ayuda con un script [PERL]
« en: 16 Enero 2017, 16:53 pm »

Hola a todos, programando en perl como suelo hacer casi siempre ultimamente (ya soy un poco mejor que la ultima vez que pregunte por aqui) me ha salido un problema del que no se salir.
Mi idea era crear un script que leyera el espacio del sistema de archivos que se quiera (solo funciona en linux por teams de modulos y tal), que diga el tipo de fs, elespacio restante, el usado, y avisara en caso de que hubiera menos espacio libre que un tanto porciento (en el script es un 10).
Todo suena muy bien y me pongo a programar:
Código:
Código
  1.  
  2. #!usr/bin/perl
  3. #solo funciona para unix/linux/solaris(solaris ni idea)
  4. #si da el error "Undefined subroutine &main::SYS_statfs called at Filesys/DiskSpace.pm at line XXX", editar syscall.ph
  5. # (en el perl lib tree) y copiar la linea "SYS_statfs {196;}" fuera del "if (defined &__hp9000s800)" (alrededor de la linea 356)
  6. use strict ;
  7. use warnings ;
  8. use Filesys::DiskSpace ;
  9. use POSIX ;
  10. #sistema de archivos/particion a comprobar espacio
  11. #sacar fecha ;
  12. my $TIME = strftime("%d/%m/%Y %H:%M:%S", localtime(time) ) ;
  13. print "+----------+---+----------+\n" ;
  14. print "+Script made up by 0uts1de+\n" ;
  15. print "+----------+---+----------+\n" ;
  16. print "Today is $TIME \n" ;
  17. print "Write the filesystem/partiton you want to monitor, for example /home or /usr \n" ;
  18. my $monit = <STDIN> ;
  19. chomp $monit ;
  20. print "##warning level is by default about a 20 % of free space, if u want to change this##\n" ;
  21. print "##change the variable warn in the script with a editor like vim or gedit ##\n" ;
  22. ########## warn string ############
  23. my $warn = 10 ;
  24. ###################################
  25. #consegir caracteristicas de la particion/filesystem (raw)
  26. my ($fs_type, $fs_desc, $used, $avail, $fused, $favail) = df $monit ;
  27. my $monit_percentual = (  $avail  /  $avail+$used  ) * 100 ;
  28. my $final_used = $used / 1000 ;
  29. my $final_avail = $avail / 1000 ;
  30. print "$monit is a $fs_type filesystem who has $final_used space used (in MB) and $final_avail of avalible space (in MB too) \n" ;
  31. #comparacion con el porcentaje de $monit_percentual
  32. if ($monit_percentual < $warn) {
  33.        print "Less of the $warn % of the space of the filesystem $monit is avalible for use, consider uninstall unused software \n" ;
  34. }
  35. elsif ($monit_percentual eq $warn) {
  36.        print "Be carefull, exactly the $warn % of the space of $monit is usable, consider uninstall unused software \n" ;
  37. }
  38. else {
  39.        print "There is a $monit_percentual % of avarible space of the disk \n" ;
  40. }
  41.  
Pero ahora viene mi duda, y es que de imput recibo este error y despues de varias horas rascandome la cabeza sigo desconociendo proqué se produce:
Codigo:
Código
  1. +----------+---+----------+
  2. +Script made up by 0uts1de+
  3. +----------+---+----------+
  4. Today is 16/01/2017 16:31:04
  5. Write the filesystem/partiton you want to monitor, for example /home or /usr
  6. /
  7. ##warning level is by default about a 20 % of free space, if u want to change this##
  8. ##change the variable warn in the script with a editor like vim or gedit ##
  9. Illegal division by zero at analizador de filesystem (16-1-17).pl line 35, <STDIN> line 1.
  10.  

(el / que se ve en la linea 6 de la salida es mi input, ya que queria probar con el sistema de archivos /)
Como ya dije en mi anterior post, gracias por adelantado :D


En línea

if (you eq coment){
   print "gracias" ;
}
else {
print ":("  ;
}
explorer

Desconectado Desconectado

Mensajes: 101


Analista/Programador Perl


Ver Perfil
Re: Ayuda con un script [PERL]
« Respuesta #1 en: 16 Enero 2017, 23:36 pm »

Lo más probable es que Filesys::DiskSpace::df() no haya sido capaz de sacar la información que se le solicita. Tiene algunos problemas.
 
Después de la línea 26 deberías comprobar que los valores que te devuelve df() son consistentes, o si contienen valores erróneos.

La división por cero creo que se produce en la línea 27, en la que además hay un error: falta poner paréntesis alrededor de $avail+$used. Sin los paréntesis, la operación

my $monit_percentual = (  $avail  /  $avail+$used  ) * 100;

en realidad es

my $monit_percentual = ( ($avail / $avail) +$used) * 100;

Es por la precedencia de los operadores: la división tiene más precedencia que la suma.

Pero antes de hacer la división debes comprobar que $avail+$used es mayor que 0, porque si no salta el error.


En línea

0uts1de

Desconectado Desconectado

Mensajes: 8


Might take your diamonds but I'll steal your heart


Ver Perfil
Re: Ayuda con un script [PERL]
« Respuesta #2 en: 17 Enero 2017, 10:15 am »

Lo más probable es que Filesys::DiskSpace::df() no haya sido capaz de sacar la información que se le solicita. Tiene algunos problemas.
 
Después de la línea 26 deberías comprobar que los valores que te devuelve df() son consistentes, o si contienen valores erróneos.

La división por cero creo que se produce en la línea 27, en la que además hay un error: falta poner paréntesis alrededor de $avail+$used. Sin los paréntesis, la operación

my $monit_percentual = (  $avail  /  $avail+$used  ) * 100;

en realidad es

my $monit_percentual = ( ($avail / $avail) +$used) * 100;

Es por la precedencia de los operadores: la división tiene más precedencia que la suma.

Pero antes de hacer la división debes comprobar que $avail+$used es mayor que 0, porque si no salta el error.

Efectivamente, despues de varios test y de mirar el link que me has enviado el comando df no podía obtener los valores.
Hoy en dia estoy usando en ved de Filesys:.DiskSpace el modulo Sys::Filesystem junto al submodulo Sys::Filesystem:Linux para hacer esta tarea.
Ahora lo unico que necesito es saber como poner una cantidad de tiempo antes de que prosiga con el resto del script, pero no creo que me lleve mucho tiempo descubrir como si se puede.
Gracias por la ayuda!
« Última modificación: 17 Enero 2017, 10:19 am por 0uts1de » En línea

if (you eq coment){
   print "gracias" ;
}
else {
print ":("  ;
}
explorer

Desconectado Desconectado

Mensajes: 101


Analista/Programador Perl


Ver Perfil
Re: Ayuda con un script [PERL]
« Respuesta #3 en: 17 Enero 2017, 12:36 pm »

Puedes hacer un bucle sin fin, con un sleep en el interior, para que haga una espera entre comprobaciones...
En línea

0uts1de

Desconectado Desconectado

Mensajes: 8


Might take your diamonds but I'll steal your heart


Ver Perfil
Re: Ayuda con un script [PERL]
« Respuesta #4 en: 20 Enero 2017, 10:21 am »

Pues no habia pensado en ello, ahora si que si muchas gracias  y doy el tema como resuelto ;D
En línea

if (you eq coment){
   print "gracias" ;
}
else {
print ":("  ;
}
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con script de Perl
Scripting
stres 0 3,580 Último mensaje 26 Mayo 2004, 07:15 am
por stres
ayuda con un script en perl
Scripting
cuenta.net 0 1,473 Último mensaje 31 Octubre 2011, 22:45 pm
por cuenta.net
SCRIPT PERL
Nivel Web
mendax 1 1,887 Último mensaje 6 Febrero 2015, 21:29 pm
por engel lex
AYUDA con Script para un plugin de perl!
Scripting
Kithai 1 1,865 Último mensaje 21 Noviembre 2016, 16:58 pm
por Ocelot1994
Ayuda con un script perl:
Scripting
0uts1de 2 2,039 Último mensaje 14 Diciembre 2016, 16:46 pm
por 0uts1de
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines