• Publicidad

Problema con metodo get() módulo Net::FTP

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Problema con metodo get() módulo Net::FTP

Notapor aidewuado » 2012-02-02 16:19 @721

Hola, chicos, ¿cómo están?

Hace poco empecé a realizar desarrollos en Perl. Recientemente generé un script que se conecta a un servidor y me trae archivos de acuerdo a la fecha de los archivos. Esto funcionaba bien para ese servidor, pero al aplicar el script en otro servidor me di cuenta que al ejecutar el script al momento del get se quedaba como pausado un tiempo y seguía, el archivo en el que se queda pausado el método get no lo trae.
Mi consulta es saber si es que hay alguna manera de saber si el archivo remoto está siendo tomado por un proceso X y por eso el get me da time out, o en el caso contrario, salir del ftp para validar si me traje el archivo.

Mi script es el siguiente.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. #Conexiones FTP para traer archivos
  3. #Autor EDG
  4.  
  5. use strict;
  6. use POSIX qw/ strftime/;
  7. use Net::FTP;
  8.  
  9. my $user = "usuario";
  10. my $pass = "password";
  11.  
  12. #Conexión a FTP
  13. my $ftp = Net::FTP -> new("192.168.102.XX") or die ("No se pudo establecer conexion: $!");
  14. $ftp ->login($user,$pass) or die("Login incorrecto: $!");
  15.  
  16. my $fecha_actual = strftime('%Y%m%d', localtime(time));
  17. #my $fecha_actual = "20111206";
  18. sub PWD
  19. {
  20.         my $dir = $ftp->pwd();
  21.         print "$dir\n";
  22. }
  23.  
  24. $ftp->cwd("ruta donde estan los archivos (/root/algo)");
  25. my @contenido = $ftp->ls();
  26. print "#### Carga de Archivos servidor ####\n";
  27. my $index = 0;
  28. my $cantidad = 0;
  29. foreach (@contenido) {
  30.         my $tiempo = $ftp -> mdtm("$contenido[$index]");
  31.         my $convert =strftime('%Y%m%d',localtime($tiempo));
  32.         if ($convert == $fecha_actual)
  33.         {
  34.             $ftp -> get ("$contenido[$index]","/rutadestino/$contenido[$index]");
  35.             print "Se trasnfiere Archivo : $contenido[$index]\n";
  36.             $cantidad ++;
  37.         }
  38.         $index ++;
  39. }
  40. open (SALIDA, " >/logdearchivosFTP/control_ftp.txt");
  41. print  SALIDA $cantidad."\n";
  42. close (SALIDA);
  43. $ftp->quit or die("No se puede desconectar del servidor: $!");
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
aidewuado
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2012-02-02 15:48 @700

Publicidad

Re: Problema con metodo get() módulo Net::FTP

Notapor explorer » 2012-02-02 16:44 @739

Bienvenido a los foros de Perl en español, aidewuado.

Hay un error en el código. En la línea 32 estás queriendo comparar fechas, que en realidad son cadenas de caracteres, usando el operador '=='. Ese operador es el comparador de igualdad numérica. Deberás cambiarlo por el operador 'eq', que es el comparador de igualdad alfanumérica.

Más información en perldoc perlop .

Luego, para saber si el fichero se ha bajado o no, podrías preguntar por la existencia del fichero en el directorio destino, con alguno de los operadores -X, como por ejemplo, el -e o el -f.

Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if (-e "/rutadestino/$contenido[$index]") {
  2.     print "El fichero $contenido[$index] se bajó correctamente\n";
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Más información en perldoc -f -X .
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con metodo get() módulo Net::FTP

Notapor aidewuado » 2012-02-06 13:54 @621

Gracias por la corrección de la línea 32, aunque el script compara bien las fechas, ya que el formato que le doy es añomesdia, quedando de forma numérica (creo yo), ya que le puedo restar un entero ejemplo: 20120106. Si hay una forma más efectiva de obtener la fecha del día de ayer lo agradeceré más.

Actualmente me encuentro ocupado en otro tema, pero teniendo un poco de tiempo veo si resulta el código para ver los archivos en el directorio destino.

Gracias =)
aidewuado
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2012-02-02 15:48 @700

Re: Problema con metodo get() módulo Net::FTP

Notapor explorer » 2012-02-06 17:30 @771

Si el resultado es numérico, entonces sí que es válido... mientras no tengas que cambiar el código para usar otro formato de fecha, claro.

Para obtener la fecha del día anterior, una forma de hacerlo es con localtime($tiempo - 86_400) (hilo al respecto)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con metodo get() módulo Net::FTP

Notapor aidewuado » 2012-02-08 09:04 @419

ok, gracias por el dato de la fecha, lo acabo de probar, quedando un script de prueba así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -l
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5. use POSIX qw/ strftime/;
  6.  
  7. my $fecha_actual=strftime('%Y%m%d',localtime(time));
  8.  
  9.  
  10. my @ayer = localtime( time - 86_400 );
  11.  
  12. use Time::Local;
  13. ###timelocal(seg,min,hora,atributo)
  14. my $time = timelocal(0,0,18,@ayer[3..5]);
  15. my $convert =strftime('%Y%m%d',localtime($time));
  16. print "fecha hoy: $fecha_actual\n";
  17. print "fecha ayer: $convert";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Me entró una duda en la línea 14... a simple vista los números que están antes de la variable son seg,min.hora, pero después de la variable hay un corchete con una sentencia que no conozco... ¿qué significa 3..5?
aidewuado
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2012-02-02 15:48 @700

Re: Problema con metodo get() módulo Net::FTP

Notapor explorer » 2012-02-08 09:13 @426

Es el operador rango. 3 .. 5 devuelve una lista de valores, en este caso numéricos, desde el 3 al 5, incluidos. Es lo mismo que escribir (3, 4, 5).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con metodo get() módulo Net::FTP

Notapor aidewuado » 2012-02-09 11:57 @540

¡Ah, ok! Entonces, como la función timelocal() devuelve muchos valores, solo me traigo los valores de hora... ¿verdad?
aidewuado
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2012-02-02 15:48 @700

Re: Problema con metodo get() módulo Net::FTP

Notapor aidewuado » 2012-03-02 10:30 @479

explorer, muchas gracias por tu ayuda, el script quedó funcionando de manera correcta...

Consulta al margen, ¿cómo puedo saber si un archivo que quiero traerme por el FTP está siendo ocupado por otra aplicación?
aidewuado
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2012-02-02 15:48 @700

Re: Problema con metodo get() módulo Net::FTP

Notapor explorer » 2012-03-02 12:20 @555

A priori, con ninguno de los comandos estándar de FTP puedes saberlo.

Lo único que puedes hacer es:
  1. Si se trata de un asunto de bloqueos provocado por usar un sistema operativo anticuado (Windows, por ejemplo), pues la solución es pedirle al administrador que ponga un sistema operativo de verdad, que no bloquee los archivos cuando son accedidos por más de una aplicación a la vez.
  2. Si se trata de asunto de esperar a que una aplicación termine de escribir o modificar el archivo (porque lo está generando o procesando), entonces:
    • Entra en un bucle
    • Pide el listado de archivos
    • Mira la fecha de modificación del archivo que quieres bajarte
    • Si la fecha es inferior a la actual menos un minuto, entonces estamos seguros de que hace un minuto que el archivo ha dejado de ser modificado, así que suponemos que ya fue terminado y cerrado. Entonces, salimos del bucle.
    • Si no, esperamos un minuto y lo volvemos a intentar, al menos durante un tiempo prudencial (hay que evitar estar en un bucle infinito)
      Después del bucle, nos bajamos el archivo, o si ha pasado mucho tiempo, entonces salimos con error.
  3. Si no se trata de nada de eso, pues no te queda más remedio que la prueba/error: intenta bajarlo, y si no puedes, es que está bloqueado. Espera un tiempo prudencial, y lo vuelves a intentar.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con metodo get() módulo Net::FTP

Notapor aidewuado » 2012-03-02 14:46 @657

Gracias, explorer.

Lo que hice es comprobar que el fichero quedara en el destino, si eso no pasaba lo trato de bajar de nuevo, de caso contrario, Error.

Pude validar que existe algo que me ocupa el fichero... Algún proceso en el otro servidor, ya que el otro servidor no es mio... mejor no meterse.
aidewuado
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2012-02-02 15:48 @700


Volver a Módulos

¿Quién está conectado?

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

cron