flock
Es una de las formas de entrelazar operaciones. La utilidad es parte del conjunto de herramientas util-linux y solo está disponible para Linux. Otras utilidades, disponibles en una gama más amplia de plataformas, se basan en la setlock
utilidad de Daniel J. Bernstein de su paquete daemontools:
setlock
de daemontools
setlock
de daemontools-encore de Bruce Guenter
s6-setlock
del s6 de Laurent Bercot
chpst
del runit de Gerrit Pape
runlock
del asesino de Wayne Marshall
setlock
de mi conjunto de herramientas nosh
Estas herramientas operan con un paradigma ligeramente diferente al utilizado en la respuesta de M. Kurenkov (una que flock
también puede emplearse, pero no en esa respuesta). Uno invoca el setlock
programa para encadenar la carga al comando que debe estar enclavado. setlock
se abre y bloquea el archivo de bloqueo, y deja un descriptor de archivo abierto en su proceso. El bloqueo persiste durante ese proceso (a menos que el comando posterior encadenado para liberar explícitamente el bloqueo al encontrar y cerrar el descriptor de archivo abierto).
Para el caso en la pregunta, uno debe enclavar el comando que produce la línea de salida, teniendo en cuenta que esto invoca un comando externo echo
en lugar de un echo
comando incorporado de shell :
setlock mylockfile echo "$ RESULT" >> ./$TEMP_DIR/$OUT_FILE
En este caso, no es necesario enclavar abriendo el archivo de salida en modo anexar. Si lo fuera, uno tendría que abrir ese archivo dentro del candado, lo que requiere usar programas como fdredir
/ redirfd
:
setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" echo "$ RESULT"
cuál se puede convertir en una función de shell si se quiere:
outfile () {setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" "$ @"; }
[...]
outfile echo "$ RESULTADO"
o apegarse a la sintaxis de shell y hacer que sea interpretada por un segundo shell que se ejecuta bajo el enclavamiento, lo que requiere algunas citas no triviales si las variables de shell de uno no se exportan como variables de entorno:
setlock mylockfile sh -c 'echo' "$ RESULT" '>> "./'$TEMP_DIR'/'$OUT_FILE'" '
Por supuesto, esto se generaliza a otras cosas además de escribir en archivos de salida:
setlock mylockfile sh -c '... enclavado; cosas ...
`pwd`
; puedes usar un punto (.
). También debe citar ese nombre de archivo completo ya que incluye variables .