GNU/Linux >> Tutoriels Linux >  >> Linux

Effectuer des opérations d'écriture atomique dans un fichier en bash

Il semble que vous deviez utiliser flock comme dans l'exemple de man (http://linux.die.net/man/1/flock)

(
flock -x 200

# Put here your commands that must do some writes atomically

) 200>/var/lock/mylockfile 

Et mettez toutes vos commandes qui doivent être atomiques dans ().


flock est l'une des manières d'imbriquer les opérations. L'utilitaire fait partie de l'ensemble d'outils util-linux et n'est disponible que pour Linux. D'autres utilitaires, disponibles sur une plus large gamme de plates-formes, sont basés sur setlock de Daniel J. Bernstein utilitaire de son package daemontools :

  • setlock de daemontools
  • setlock extrait de daemontools-encore de Bruce Guenter
  • s6-setlock de la s6 de Laurent Bercot
  • chpst extrait du runit de Gerrit Pape
  • runlock du perp de Wayne Marshall
  • setlock de mon jeu d'outils nosh

Ces outils fonctionnent avec un paradigme légèrement différent de celui utilisé dans la réponse de M. Kurenkov (celui qui flock peut également employer, mais ne le fait pas dans cette réponse). On invoque le setlock programme pour charger en chaîne à la commande qui doit être verrouillée. setlock lui-même ouvre et verrouille le fichier de verrouillage et laisse un descripteur de fichier ouvert dans son processus. Le verrou persiste aussi longtemps que ce processus (à moins que la commande suivante enchaînée à libère explicitement le verrou en trouvant et en fermant le descripteur de fichier ouvert).

Pour le cas de la question, il faut verrouiller la commande qui produit la ligne de sortie, sachant que cela invoque un externe echo à la place d'un shell intégré echo commande :

setlock mylockfile echo "$RESULT" >> ./$TEMP_DIR/$OUT_FILE

Dans ce cas, il n'est pas nécessaire d'interverrouiller l'ouverture du fichier de sortie en mode ajout. Si c'était le cas, il faudrait ouvrir ce fichier dans le verrou, ce qui nécessite soit d'utiliser des programmes comme fdredir /redirfd :

setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" echo "$RESULT"
que l'on peut transformer en fonction shell si l'on veut :

outfile() { setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" "[email protected]" ; }
[…]
outfile echo "$RESULT"
ou s'en tenir à la syntaxe du shell et la faire interpréter par un second shell s'exécutant sous le verrouillage, nécessitant des guillemets non triviaux si les variables du shell ne sont pas exportées en tant que variables d'environnement :

setlock mylockfile sh -c 'echo '"$RESULT"' >> "./'$TEMP_DIR'/'$OUT_FILE'"'

Cela se généralise bien sûr à des choses autres que l'écriture dans les fichiers de sortie :

setlock mylockfile sh -c '… interlocked ; stuff …'


Linux
  1. La fête ?

  2. Effectuer des opérations d'écriture atomique dans un fichier dans Bash ?

  3. Est-ce que Mv Atomic est sur le F?

  4. Mettre à jour l'historique de Bash sur d'autres terminaux lors de la sortie d'un terminal ?

  5. Écrire dans le fichier .txt ?

Comment lire un fichier ligne par ligne dans Bash

Commande de source bash

Bash :ajouter au fichier

Remplacement de chaîne dans Bash

35 exemples de scripts bash

Script bash (III)