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 :
setlockde daemontoolssetlockextrait de daemontools-encore de Bruce Guenters6-setlockde la s6 de Laurent Bercotchpstextrait du runit de Gerrit Paperunlockdu perp de Wayne Marshallsetlockde 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 …'