Résolu Problème parcours de fichier en PERL

  • Auteur de la discussion jinpol
  • Date de début

jinpol

Habitué
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 :

[cpp]#! /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...
}[/cpp]

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...
 

zeb

Modérateur
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...
 

jinpol

Habitué
Meilleure réponse
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 :

[cpp]
#! /usr/bin/perl
my $found=0;

foreach my $line (qx(mount)) {
chomp($line);
print $_;

if($line =~ m!^//10.27.0.136!)
etc...
[/cpp]

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...
 

zeb

Modérateur
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
en dehors des citations. Utilise [cpp],
Code:
 voire [fixed] qui est sympa pour les fichiers texte. ;)
 

jinpol

Habitué
 

zeb

Modérateur
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 ... ;)
 

jinpol

Habitué


Et tu as bien raison...je l'ai d'ailleurs fait avec plaisir, histoire de m'endormir un peu moins bête ce soir :)
 

jinpol

Habitué
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.

[cpp]
#!/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");
}

[/cpp]

Voilà, vous savez tout.

Tchuss, @+, jinpol...
 

jinpol

Habitué
lol, j'avais pas vu que j'avais déjà mis la solution.

Bon ben elle y est en double maintenant :)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 097
Membres
1 586 286
Dernier membre
petitangebleu1977
Partager cette page
Haut