Se connecter avec
S'enregistrer | Connectez-vous

Problème parcours de fichier en PERL

Dernière réponse : dans Programmation

Salut tout le monde.

J'ai un petit souci et j'espère que vous allez pouvoir m'aider.

J'ai écris un petit script PERL qui a pour but de vérifier que des répertoires sont bien montés entre un serveur Linux et un serveur Windows 2003.

Voilà le squelette de mon script :

  1. #! /usr/bin/perl
  2.  
  3. # output mount
  4. system("mount > /root/mountlog2");
  5.  
  6. # open log
  7. unless(open(INPUT, "/root/mountlog2"))
  8. {
  9. die("cannot open /root/mountlog2\n");
  10. }
  11.  
  12. # parse log
  13. my $found=0;
  14.  
  15. while(<INPUT>)
  16. {
  17. $line=$_;
  18. chomp($line);
  19. print $_;
  20.  
  21. if($line =~ m!^//10.27.0.136!)
  22. {
  23. $found++;
  24.  
  25. unless(open(INPUT, "/home/postgresql/mnt/devwin1/checkmountphptmp"))
  26. {
  27. system("sleep 120");
  28. system("umount -f /home/postgresql/mnt/devwin1/phptmp");
  29. $found--;
  30. }
  31. }
  32. elsif($line =~ m!^//10.27.0.136/Backup!)
  33. {
  34. $found++;
  35.  
  36. #system("echo 1 > /home/postgresql/mnt/devwin1/checkmountsave_pnb");
  37. unless(open(INPUT, "/home/postgresql/mnt/devwin1/checkmountsave_pnb"))
  38. {
  39. system("sleep 120");
  40. system("umount -f /home/postgresql/mnt/devwin1/save_pnb");
  41. $found--;
  42. }
  43. }
  44. elsif
  45.  
  46. etc...
  47. }


Donc en gros, je mets le résultat de 'mount' dans un fichier, puis j'ouvre ce fichier et je le parcours.
Je vérifie que mes répertoires sont bien montés comme ceci.
Mais apparemment, le fichier n'est pas parcouru dans sa totalité. En effet, vu que j'ai remarqué un problème, j'ai fait afficher via print la variable $_, et voilà ce que cela donne :

Citation :

//10.27.0.133/phptmp on /home/postgresql/mnt/serveur1/phptmp type cifs (rw,mand)
nfsd on /proc/fs/nfsd type nfsd (rw)
//10.27.0.134/phptmp on /home/postgresql/mnt/serveur2/phptmp type cifs (rw,mand)
1


Je vous passe un certain nombre de lignes qui ne servent à rien...

Alors que dans mon fichier mountlog2, j'ai :

Citation :

//10.27.0.133/phptmp on /home/postgresql/mnt/serveur1/phptmp type cifs (rw,mand) nfsd on /proc/fs/nfsd type nfsd (rw)
//10.27.0.134/phptmp on /home/postgresql/mnt/serveur2/phptmp type cifs (rw,mand)
//10.27.0.136/phptmp on /home/postgresql/mnt/serveur3/phptmp type cifs (rw,mand)
//10.27.0.136/Backup on /home/postgresql/mnt/serveur3/save_pnb type cifs (rw,mand)
etc...


On voit donc bien qu'il s'arrête après la ligne concernant le serveur 2, et que $_ m'affiche '1'.

Il y a quelque chose qui m'échappe, mais quoi ???

Si quelqu'un a la solution, je lui en serai très reconnaissant car là, je sèche. je ne suis pas super familier avec PERL et c'est donc peut-être tout simple...mais pas pour moi :) 

Merci d'avance pour vos réponses.

Tchuss, @+, jinpol...

Autres pages sur : probleme parcours fichier perl

Lassé par la pub ? Créez un compte

Meilleure solution

C'est bon, je pense que j'ai trouvé pourquoi ça ne marchait pas.

En fait, à chaque fois que j'utilisai open, je mettais l'identifiant INPUT. Du coup, mon while ne parcourait plus le bon fichier au bout d'un moment.

Donc, il faut soit que j'utilise d'autre identifiant pour mes unless, soit que j'utilise pour parcourir le résultat de mon mount le code suivant :

  1. #! /usr/bin/perl
  2. my $found=0;
  3.  
  4. foreach my $line (qx(mount)) {
  5. chomp($line);
  6. print $_;
  7.  
  8. if($line =~ m!^//10.27.0.136!)
  9. etc...


Et tu as raison, ma première condition est moins restrictive que ma deuxième, mais c'était pour faire des tests et j'ai oublié de corriger avant de poster sur le forum :) 

En tous cas, merci pour ton aide.

Tchuss, @+, jinpol...
Expert Programmation

Salut !

Euh, plutôt que d'écrire un fichier avec mount, ne peux-tu pas te contenter de lire /etc/mtab ?
Compare tes lignes 21 et 32 : La première condition est moins restrictive que la dernière !

Je regarde le reste d'un peu plus près.
Patience...
Expert Programmation

Eh, attends, je n'en ai pas encore fini avec toi. Première ligne : première erreur. :D 
Le hashbang doit être immédiatement suivi du nom de l'interpréteur. Il ne doit pas y avoir d'espace.

Tu t'es renseigné sur /etc/mtab ?

---------------------------------
[:zeb:6] Comme tu donnes toi-même une solution, je t'accorde la meilleure réponse.

Evite l'utilisation de la balise
Citation :
en dehors des citations. Utilise [cpp], [code] voire [fixed] qui est sympa pour les fichiers texte. ;) 

zeb a dit :
Eh, attends, je n'en ai pas encore fini avec toi. Première ligne : première erreur. :D 
Le hashbang doit être immédiatement suivi du nom de l'interpréteur. Il ne doit pas y avoir d'espace.

Tu t'es renseigné sur /etc/mtab ?

---------------------------------
[:zeb:6] Comme tu donnes toi-même une solution, je t'accorde la meilleure réponse.

Evite l'utilisation de la balise
Citation :
en dehors des citations. Utilise [cpp], [code] voire [fixed] qui est sympa pour les fichiers texte. ;) 
Citation :


Bien chef :) 

Sinon, je viens d'enlever l'espace, et pour le fichier mtab, je me suis renseigné, comme un bon élève que je suis :) 
En fait, dans fstab, l'admin configure les dossiers qu'il veut monter à l'appel de mount -a, alors que mtab contient les dossiers effectivement montés. C'est un fichier dynamique.

J'ai bon ???

D'ailleurs j'ai une autre question concernant le montage, mais je ne crois pas que ce soit le bon endroit pour la poser :) 
Expert Programmation

Oki. En fait, je te proposais de te renseigner, c'est tout. Pas de me prouver que tu l'avais fait ;)  En fait, mount sans argument ne fait que lire le fichier mtab. C'est pourquoi un mount > mon_fichier semble un peu lourd, d'autant qu'il faut les droits root sur certains systèmes pour accéder à cette commande.

Ça ne semble pas être ton soucis d'ailleurs. Evite d'utiliser le compte root le plus possible. Ce n'est qu'un conseil. Tu en fais ce que tu veux :o 

A te lire en cat' Linux pour la suite ... ;) 

Hello, voici la réponse à mon problème.

En fait, à chaque fois que j'ouvrai un fichier, j'utilisai l'identifiant INPUT. Donc au bout d'un moment, mon while ne parcourait tout simplement plus le bon fichier :) 

Je remets mon code car il a été un peu modifié, sur les conseils de quelqu'un qui s'y connaissait un peu plus que moi.

  1. #!/usr/bin/perl
  2.  
  3. # output mount
  4. #system("mount > /root/mountlog2");
  5.  
  6. # open log
  7. #unless(open(INPUT, "/root/mountlog2"))
  8. #{
  9. # die("cannot open /root/mountlog2\n");
  10. #}
  11.  
  12. # parse log
  13. my $found=0;
  14.  
  15. #while(<INPUT>)
  16. foreach my $line (qx(mount))
  17. {
  18. #$line=$_;
  19. #print $line;
  20. chomp($line);
  21.  
  22. #system("echo $_ >> /home/postgresql/mnt/mountlog");
  23.  
  24. if($line =~ m!^//10.27.0.136/phptmp!)
  25. {
  26. $found++;
  27.  
  28. system("echo 1 > /home/postgresql/mnt/server1/checkmountphptmp");
  29. unless(open(INPUT, "/home/postgresql/mnt/server1/checkmountphptmp"))
  30. {
  31. system("sleep 120");
  32. system("umount -f /home/postgresql/mnt/server1/phptmp");
  33. $found--;
  34. }
  35. }
  36. elsif($line =~ m!^//10.27.0.136/Backup!)
  37. {
  38. $found++;
  39.  
  40. system("echo 1 > /home/postgresql/mnt/server1/checkmountsave_pnb");
  41. unless(open(INPUT, "/home/postgresql/mnt/server1/checkmountsave_pnb"))
  42. {
  43. system("sleep 120");
  44. system("umount -f /home/postgresql/mnt/server1/save_pnb");
  45. $found--;
  46. }
  47. }
  48.  
  49. etc...
  50.  
  51. }
  52.  
  53.  
  54. if($found < 3)
  55. {
  56. system("mount -a");
  57. }


Voilà, vous savez tout.

Tchuss, @+, jinpol...
Lassé par la pub ? Créez un compte