Le méme mais qui ne fonctionne pas... lol - Perl - Programmation
Marsh Posté le 11-10-2005 à 11:33:13
Je pense qu'il y a une erreur à la 14e ligne de ton script
Marsh Posté le 11-10-2005 à 11:36:39
Clair, je ne vois pas comment on peux t'aider, là.
Euh, il y a un serveur FTP sur toutes les machines sur lesquelles tu vas chercher ton fichier ?
Marsh Posté le 11-10-2005 à 12:12:28
Merci d'avoir répondu
Je pense qu'il y a une erreur à la 14e ligne de ton scrip
lol
J'ai hésité à mettre le script mais comme il marche pour le dossier juste à coté je pensais que ce n'était pas nécéssaire, le voici :
#!/usr/bin/perl
#Recupere les fichiers de logs cree il y a $n jours
use strict; #Syntaxe stricte
use Net::FTP; #charge le module netftp
use POSIX qw(strftime); #charge la fonction strftime
use IO::Handle; #charge le module IOHandle
STDOUT->autoflush(1); #enlever le buffer sur stdout
my $n = 0;
my ($adresse,$login,$pass,$rep) = ("XX","XX","XX","XX" ); #définir 4 variables, mettre my pour dire que les variables sont locales
my $ftp = Net::FTP->new($adresse, Debug => 0) or die "Unable to connect to $adresse\n"; #crée un nouvel objet netftp qui s'appelera $ftp
$ftp->login($login,$pass) or die "Unable to log in : $ftp->message\n";
#méthode login sur l'objet ftp
$ftp->cwd($rep) or die "Unable to cd to $rep : $ftp->message\n";
my @lines = $ftp->ls; #récupére chaque ligne du tableau avec le nom du fichier
foreach(@lines) {
my @ftime = localtime($ftp->mdtm($_));#récupère le temps de modification du fichier courant
my @ltime = localtime(time-$n*86400);#récupére la date d'il y a n jours
if ($ftime[5] == $ltime[5] && $ftime[4] == $ltime[4] && $ftime[3] ==
$ltime[3]) {
print "Downloading $_...";
$ftp->get($_); #téléchargement du fichier de logs en question
print "done\n";
}
}
$ftp->quit;
Or ce script fonctionne dans un cas mais pas dans l'autre.
Voici l'architecture du serveur D:\dossier\A\logs
et D:\dossier\B\logs, la procedure marche trés bien pour la A, mais ne marche pas pour le B....
Savez vous ce que veux dire le fait que lorsqu'on lance le script, rien ne se passe et il n'y a pas de message d'erreur, puis j'ai une nouvelle invite de commande.... ?
Citation : [root@awstats client_B]# perl get.pl |
Merci par avance
Marsh Posté le 11-10-2005 à 17:00:52
Je remets mon sujet en haut de la pile une derniére fois, j'ai beau cherché, cela reste un mystére......
Je prends toutes les idées, sinon merci quand méme.
SK
Marsh Posté le 11-10-2005 à 17:07:19
Vu qu'il y a tous les contrôles d'erreur nécessaires, et qu'il n'y a pas de message d'erreur, je ne vois qu'une possibilité, celle qu'aucun fichier ne correspond à la condition :
if ($ftime[5] == $ltime[5] && $ftime[4] == $ltime[4] && $ftime[3] == $ltime[3]) |
(par contre pas mal de commentaires sont inutiles et alourdissent la lecture, un commentaire ne devrait servir qu'à expliquer une partie ardue du code, ou à décrire l'utilité d'un bloc de code)
Marsh Posté le 11-10-2005 à 17:32:47
Merci pour ton aide Elmorlcq!
Ta remarque est trés pertinante donc j'ai regardé, et ce sont en fait exactement les méme fichiers de logs qui sont présents dans le client A et le client B, comme il trouve les fichiers pour le client A, (condition remplie), je ne comprend pas pourquoi la condition ne serait pas remplie pour le client B, étant donné que l'on a deux fichiers identiques?
Pour les commentaires, je suis d'accord mais ce n'est pas moi qui est réalisé ce script donc afin de tout saisir, on m'a mis des commentaires.
Tu as l'air de t'y connaitre en perl, j'ai cherché sans succés, une commande perl que je pourrais rajouter dans le programme afin de voir ce que mon script exécute durant son passage dans le terminal. Ceci afin d'avoir une piste pour chercher... Connaitrais tu une telle commande?
Merci par avance
SK
Marsh Posté le 11-10-2005 à 17:38:48
yohannsk a écrit : et ce sont en fait exactement les méme fichiers de logs qui sont présents dans le client A et le client B, comme il trouve les fichiers pour le client A, (condition remplie) |
Pas forcément.
La condition, c'est que la date (aujourd'hui - $n jours) soit identique à la date de dernière modification du fichier.
Si tu as recopié le fichier sur le client B pour le tester, sa date de modification sera différente de celle du client A, alors que pourtant le contenu est identique.
Sous Windows comme sous Unix tu peux vérifier la date de dernière modification en vérifiant les propriétés du fichier en question.
Marsh Posté le 12-10-2005 à 08:55:50
Mon cher Elmoricq, en effet l'habit ne fait pas le moine, j'avias deux fichiers ex051003.log, identiques par le nom dans chaque dossier mais comme tu m'a fait le remarquer, la date n'était pas valide, en effet pour le client A j'avais un fichier qui daté du 11 octobre, qui est dans la troisiéme semaine du mois d'octobre de 2005 d'ou ex051003, et pour le client B un fichier qui daté du 9 octobre, qui est dans la troisiéme semaine du mois d'octobre de 2005 d'ou ex051003 mais qui ne satisfasait pas la condition.....
Donc voila, y'a un probléme de configuration de génération des logs.... Va falloir y remédier mais ma hiérarchie le fera...
Ton aide me fut trés précieuse et je t'en remercie. Bien à toi
P.S: pour pospos,il me semble que print affiche plutot ce que l'on écrit dans le programme et non ce qu'éxécute le programme....
++ SK!!
Marsh Posté le 11-10-2005 à 10:10:04
Bonjour amis programmeurs en tous genres!
Voila, je vous expose mon probléme, je posséde un script en perl qui va cherché via ftp des logs sur un serveur distant, ce script fonctionne pour les logs du client A. Or les logs d'un client B et C qui sont sur la méme machine (Un Windows.... lol) mais dans un repertoire juste à coté ne sont pas téléchargé avec ce méme script perl.....
Je travaille sous une RedHat et les droits des fichiers semblent étre bons. Quand je lance pour le client A dans un terminal, j'ai :
[root@awstats client_A]# perl get.pl
Downloading ex051003.log...done
[root@awstats client_A]#
Et pour le client B et C j'ai:
[root@awstats client_B]# perl get.pl
[root@awstats client_B]#
Rien n'a l'air de se passer....
Quelqu'un aurait il une idée s'il vous plait car je suis vraiment bloqué...
Au pire connétriez vous une syntaxe que je puisse rajouter dans mon script perl pour voir l'éxécution du script dans mon terminal... Je n'ai pas trouvé une telle commande...
En vous remerciant par avance
SK!!
---------------
Il vaut mieux se taire et passer pour un con, plutot que l'ouvrir et prouver que l'on en est bien un....