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:
Ces 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 le setlock
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'une echo
commande intégrée au shell :
setlock mylockfile echo "$ RESULT" >> ./$TEMP_DIR/$OUT_FILE
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 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" "$ @"; }
[…]
Écho de fichier "$ RESULT"
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:
setlock mylockfile sh -c 'echo' "$ RESULT" '>> "./'$TEMP_DIR'/'$OUT_FILE'" '
Bien sûr, cela se généralise à autre chose que l'écriture dans des fichiers de sortie:
setlock mylockfile sh -c '… verrouillé; des trucs …'
`pwd`
; vous pouvez simplement utiliser un point (.
). Vous devez également citer ce nom de fichier entier car il comprend des variables .