Téléchargement
illégal
Posez votre question Signaler

Problème script bash (accès multiple) [Résolu]

gnugo - Dernière réponse le 2 févr. 2012 à 11:42
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
}
Lire la suite 

Problème script bash (accès multiple) »

17 réponses
Réponse
+1
moins plus
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".

;-))
Ajouter un commentaire
Réponse
+0
moins plus
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
gnugo - 2 févr. 2012 à 10:14
En fait, je pense que je cherchais complication pour rien
Les descripteurs sont liés au processus donc peut importe le numéro, il sera utilisé uniquement par le sous shell créé

Donc je lie le descripteur 8 à mon fichier lockfile
puis, flock essaie de voir s'il peut écrire dans ce descripteur local (je suppose, ne connaissant pas le fonctionnement interne de flock), et s'il ne peut pas, il attend

Donc aucun problème. Au moins maintenant je comprends (à peu près) ce que je fais
Merci pour l'aide que vous m'avez apportée.

Par contre je n'ai pas bien compris comment le système gère ce refus d'écrire dans un fichier ouvert :
J'ai fait le test en affectant la sortie en erreur d'un shell à un fichier : exec 2>tmp
Je retrouve bien toutes les erreurs des commandes que je tape dans le fichier tmp
Mais en lançant un autre terminal , un echo aa >tmp écrase ce fichier sans problème.
Mes erreurs suivantes s'écrivent alors à la suite de "aa" dans le fichier, comme si j'avais fait un 2>>tmp.
File_descripteur > fichier ne semble donc pas verrouiller ce fichier ! Comment ça se fait? ça marche comment ?
zipe31- 2 févr. 2012 à 10:19
Peut être en le fermant ? ;-\

n>&-

    Ferme le descripteur de fichiers de sortie n.
gnugo - 2 févr. 2012 à 11:42
Je pense que le ">fichier" ne l'ouvre pas directement en écriture, donc il n'est pas verrouillé, donc c'est normal.
En tout cas, problème résolu.
Merci.
Ajouter un commentaire
Ce document intitulé « Problème script bash (accès multiple) » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?