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 daemontoolssetlock
extrait de daemontools-encore de Bruce Guenters6-setlock
de la s6 de Laurent Bercotchpst
extrait du runit de Gerrit Paperunlock
du perp de Wayne Marshallsetlock
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]" ; }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 :
[…]
outfile echo "$RESULT"
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 …'