Après avoir parcouru la documentation de bash , cette question et celle- ci ne me permettent toujours pas de savoir comment effectuer des opérations d'écriture atomique (ajouter) dans un fichier en bash. J'ai un script qui est exécuté dans plusieurs instances et à un moment donné, je dois écrire des données dans un fichier:
echo "$RESULT" >> `pwd`/$TEMP_DIR/$OUT_FILE
Comment est-il possible de rendre atomiques toutes les opérations d'écriture de tous les scripts exécutés simultanément (afin que les données d'une instance ne chevauchent pas les données d'une autre)?
`pwd`
; vous pouvez simplement utiliser un point (.
). Vous devez également citer ce nom de fichier entier car il comprend des variables .pwd
plus tôt dans le script pour informer l'utilisateur du répertoire de travail actuel et également écrire des entrées dans un fichier journal. regardant maintenant les FIFO.mkfifo
et pas exactement le niveau d'introduction.Réponses:
Il semble que vous devez utiliser
flock
comme dans l'exemple de man ( http://linux.die.net/man/1/flock )Et mettez toutes vos commandes qui doivent être atomiques dans ().
la source
/var/lock/mylockfile
que le verrouillage soit disponible./var/lock/mylockfile
par le processus qui a appeléflock -x
?(flock -x 200; date; sleep 10; date;) 200>/var/lock/mylockfile
dans deux shells et voir que les déverrouillages ne se produisent qu'après l'exécution de toutes les commandes dans () (c'est-à-dire dans un sous-shell)flock
est l'un des moyens de verrouillage des opérations. L'utilitaire fait partie du jeu 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 l'setlock
utilitaire de Daniel J. Bernstein à partir de son package daemontools:setlock
de daemontoolssetlock
daemontools-encore de Bruce Guenters6-setlock
du s6 de Laurent Bercotchpst
de Gerrit Pape's runitrunlock
du perp de Wayne Marshallsetlock
de ma trousse à outilsCes outils fonctionnent avec un paradigme légèrement différent de celui utilisé dans la réponse de M. Kurenkov (un qui
flock
peut également utiliser, mais pas dans cette réponse). On appelle lesetlock
programme pour chaîner la charge à 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 le fait (sauf si la commande suivante chaînée pour libérer explicitement le verrou en recherchant 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 appelle un externe
echo
à la place d'uneecho
commande intégrée au shell :Dans ce cas, il n'est pas nécessaire de verrouiller 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 l'utilisation de programmes comme
que l'on peut transformer en fonction shell si l'on veut: ou s'en tenir à la syntaxe du shell et la faire interpréter par un second shell exécuté sous le verrouillage, nécessitant des citations non triviales si ses variables de shell ne sont pas exportées en tant que variables d'environnement:fdredir
/redirfd
:Bien sûr, cela se généralise à autre chose que l'écriture dans des fichiers de sortie:
la source