2012-02-02 16:19 @721 |
|
|
aidewuado
Perlero Nuevo
|
Registrado: 2012-02-02 15:48 @700 Mensajes: 6
|
|
|
Problema con metodo get() módulo Net::FTP
|
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. Using perl Syntax Highlighting #!/usr/bin/perl -w
#Conexiones FTP para traer archivos
#Autor EDG
use strict;
use POSIX qw/ strftime/;
use Net::FTP;
my $user = "usuario";
my $pass = "password";
#Conexión a FTP
my $ftp = Net::FTP -> new("192.168.102.XX") or die ("No se pudo establecer conexion: $!");
$ftp ->login($user,$pass) or die("Login incorrecto: $!");
my $fecha_actual = strftime('%Y%m%d', localtime(time));
#my $fecha_actual = "20111206";
sub PWD
{
my $dir = $ftp->pwd();
print "$dir\n";
}
$ftp->cwd("ruta donde estan los archivos (/root/algo)");
my @contenido = $ftp->ls();
print "#### Carga de Archivos servidor ####\n";
my $index = 0;
my $cantidad = 0;
foreach (@contenido) {
my $tiempo = $ftp -> mdtm("$contenido[$index]");
my $convert =strftime('%Y%m%d',localtime($tiempo));
if ($convert == $fecha_actual)
{
$ftp -> get ("$contenido[$index]","/rutadestino/$contenido[$index]");
print "Se trasnfiere Archivo : $contenido[$index]\n";
$cantidad ++;
}
$index ++;
}
open (SALIDA, " >/logdearchivosFTP/control_ftp.txt");
print SALIDA $cantidad."\n";
close (SALIDA);
$ftp->quit or die("No se puede desconectar del servidor: $!");
|
2012-02-02 16:44 @739 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10270
|
|
|
Re: Problema con metodo get() módulo Net::FTP RESUELTO
|
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í: Using perl Syntax Highlighting if (-e "/rutadestino/$contenido[$index]") {
print "El fichero $contenido[$index] se bajó correctamente\n";
}
Más información en perldoc -f -X .
_________________ JF^D Perl programming
|
2012-02-06 13:54 @621 |
|
|
aidewuado
Perlero Nuevo
|
Registrado: 2012-02-02 15:48 @700 Mensajes: 6
|
|
|
Re: Problema con metodo get() módulo Net::FTP
|
|
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 =)
|
2012-02-06 17:30 @771 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10270
|
|
|
Re: Problema con metodo get() módulo Net::FTP
|
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
|
2012-02-08 09:04 @419 |
|
|
aidewuado
Perlero Nuevo
|
Registrado: 2012-02-02 15:48 @700 Mensajes: 6
|
|
|
Re: Problema con metodo get() módulo Net::FTP
|
ok, gracias por el dato de la fecha, lo acabo de probar, quedando un script de prueba así: Using perl Syntax Highlighting #!/usr/bin/perl -l
use strict;
use warnings;
use diagnostics;
use POSIX qw/ strftime/;
my $fecha_actual=strftime('%Y%m%d',localtime(time));
my @ayer = localtime( time - 86_400 );
use Time::Local;
###timelocal(seg,min,hora,atributo)
my $time = timelocal(0,0,18,@ayer[3..5]);
my $convert =strftime('%Y%m%d',localtime($time));
print "fecha hoy: $fecha_actual\n";
print "fecha ayer: $convert";
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?
|
2012-02-09 11:57 @540 |
|
|
aidewuado
Perlero Nuevo
|
Registrado: 2012-02-02 15:48 @700 Mensajes: 6
|
|
|
Re: Problema con metodo get() módulo Net::FTP
|
|
¡Ah, ok! Entonces, como la función timelocal() devuelve muchos valores, solo me traigo los valores de hora... ¿verdad?
|
2012-03-02 10:30 @479 |
|
|
aidewuado
Perlero Nuevo
|
Registrado: 2012-02-02 15:48 @700 Mensajes: 6
|
|
|
Re: Problema con metodo get() módulo Net::FTP
|
|
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?
|
2012-03-02 12:20 @555 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10270
|
|
|
Re: Problema con metodo get() módulo Net::FTP
|
A priori, con ninguno de los comandos estándar de FTP puedes saberlo. Lo único que puedes hacer es: - 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.
- 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.
- 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
|
2012-03-02 14:46 @657 |
|
|
aidewuado
Perlero Nuevo
|
Registrado: 2012-02-02 15:48 @700 Mensajes: 6
|
|
|
Re: Problema con metodo get() módulo Net::FTP
|
|
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.
|
|
Página 1 de 1
|
[ 10 mensajes ] |
|
| Reglas del Foro |
No puedes abrir nuevos temas en este Foro No puedes responder a temas en este Foro No puedes editar tus mensajes en este Foro No puedes borrar tus mensajes en este Foro No puedes enviar adjuntos en este Foro
|
|
Socializa |
 |
|