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 :
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 :
//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 :
//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...
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 :
#! /usr/bin/perl # output mount system("mount > /root/mountlog2"); # open log unless(open(INPUT, "/root/mountlog2")) { die("cannot open /root/mountlog2\n"); } # parse log my $found=0; while(<INPUT>) { $line=$_; chomp($line); print $_; if($line =~ m!^//10.27.0.136!) { $found++; unless(open(INPUT, "/home/postgresql/mnt/devwin1/checkmountphptmp")) { system("sleep 120"); system("umount -f /home/postgresql/mnt/devwin1/phptmp"); $found--; } } elsif($line =~ m!^//10.27.0.136/Backup!) { $found++; #system("echo 1 > /home/postgresql/mnt/devwin1/checkmountsave_pnb"); unless(open(INPUT, "/home/postgresql/mnt/devwin1/checkmountsave_pnb")) { system("sleep 120"); system("umount -f /home/postgresql/mnt/devwin1/save_pnb"); $found--; } } elsif etc... }
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 :
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...
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 :
#! /usr/bin/perl my $found=0; foreach my $line (qx(mount)) { chomp($line); print $_; if($line =~ m!^//10.27.0.136!) 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...
Eh, attends, je n'en ai pas encore fini avec toi. Première ligne : première erreur.
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 ?
---------------------------------
Comme tu donnes toi-même une solution, je t'accorde la meilleure réponse.
Evite l'utilisation de la balise
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 ?
---------------------------------
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.
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 ?
---------------------------------
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
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
A te lire en cat' Linux pour la suite ...
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
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.
Voilà, vous savez tout.
Tchuss, @+, jinpol...
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.
#!/usr/bin/perl # output mount #system("mount > /root/mountlog2"); # open log #unless(open(INPUT, "/root/mountlog2")) #{ # die("cannot open /root/mountlog2\n"); #} # parse log my $found=0; #while(<INPUT>) foreach my $line (qx(mount)) { #$line=$_; #print $line; chomp($line); #system("echo $_ >> /home/postgresql/mnt/mountlog"); if($line =~ m!^//10.27.0.136/phptmp!) { $found++; system("echo 1 > /home/postgresql/mnt/server1/checkmountphptmp"); unless(open(INPUT, "/home/postgresql/mnt/server1/checkmountphptmp")) { system("sleep 120"); system("umount -f /home/postgresql/mnt/server1/phptmp"); $found--; } } elsif($line =~ m!^//10.27.0.136/Backup!) { $found++; system("echo 1 > /home/postgresql/mnt/server1/checkmountsave_pnb"); unless(open(INPUT, "/home/postgresql/mnt/server1/checkmountsave_pnb")) { system("sleep 120"); system("umount -f /home/postgresql/mnt/server1/save_pnb"); $found--; } } etc... } if($found < 3) { system("mount -a"); }
Voilà, vous savez tout.
Tchuss, @+, jinpol...
Lassé par la pub ? Créez un compte
- Contenus similaires :
- ForumProbleme lecture fichier audio lecteur NAS avec Yamaha rx-v671
- ForumProblème de fichier transformé en raccourci
- ForumProblème fichier .dmg [resolu]
- ForumExcel/VBA : Problème avec la fonction "remplacer" et d'importation de fichier
- ForumProblème de téléchargement direct des fichiers volumieux
- ForumProbleme de fichiers
- ForumProbléme fichier .bik
- ForumProbleme lecture fichier audio mp3 mpman CS120
- ForumProbleme fichier .dbx
- Voir plus