Problème script bash (accès multiple)

Résolu
gnugo -  
 gnugo -
Bonjour,

Je suis entrain de faire un script en bash pour accèder à un fichier, lire son contenu, et, en fonction de ce contenu, le modifier à chaque accès.
Je voudrais faire cela de manière sécurisée : si mon script est appelé 2 fois en un temps très court, il pourrait très bien lire 2 fois le même contenu si le premier appel ne le modifie pas suffisamment vite.
Il faudrait peut être en quelque sorte qu'il bloque le fichier tant qu'il n'a pas fait sa modif, de sorte qu'au lancement suivant, le script lira forcément la valeur modifiée. Si le lancement précédent n'a pas terminé sa modif, il attend avant de faire son traitement+modif.
Une sorte de 'select for update' de sql mais en bash.

Est-il possible de faire ça ? Je ne vois pas comment faire.

Pour l'instant ...
function acces
{
val=$(cat fichier)
newval=$(traitement $val)
echo $val > fichier
echo $val
}

2 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Une solution consiste à tester la création d'un répertoire et en fonction du code retour le traitement est effectué ou pas...

    if mkdir -p /tmp/verrou 2>/dev/null
    then
    traitement
    rmdir /tmp/verrou
    fi


    Pour ton cas il faudra sûrement combiner ça avec un "else" contenant un "sleep nn", puis mettre le tout dans une boucle "while" et jouer avec les "break/continue".

    ;-))
    1
  2. gnugo
     
    merci!
    Mais le problème c'est que si le script plante sans supprimer le dossier, alors ne verrou ne partira jamais.

    En cherchant j'ai entendu parler d'une solution, qui utilise flock.
    Mais j'ai un peu de mal à comprendre, le man n'est pas très clair, je continue à chercher
    0
    1. gnugo
       
      quand on fait
      exec 8>lockfile;
      flock -x 8;


      savez vous que signifie le 8 ?
      Je ne comprends pas bien le 8>fichier
      0
    2. gnugo
       
      en tout cas ça fonctionne

      mais
      8>fichier
      ça correspond à quoi ?
      0
    3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      le fichier est créé avec le descripteur 8 et flock -x 8 vérouille sur ce descripteur
      il y a un exemple là http://boris.muehmer.de/2011/08/08/bash-flock-example-ubuntulinux/
      0
    4. gnugo
       
      ok merci
      J'espère qu'il n'y aura pas de conflit possible en fixant un numéro de descripteur au hasard
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Le seul qui risque de poser problème (et donc à éviter) c'est le "5" (voir la note "101" en bas de page)
      0