GNU/Linux >> Tutoriales Linux >  >> Linux

Realizar operaciones de escritura atómica en un archivo en bash

Parece que necesitas usar flock como en el ejemplo 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 

Y pon todos tus comandos que deben ser atómicos en ().


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 setlock de Daniel J. Bernstein. utilidad 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 perpetrador 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 (uno que flock también puede emplear, pero no en esa respuesta). Uno invoca el setlock programa para cargar en cadena al comando que debe ser enclavado. setlock abre y bloquea el archivo de bloqueo y deja un descriptor de archivo abierto en su proceso. El bloqueo persiste mientras dure ese proceso (a menos que el siguiente comando encadenado a libere explícitamente el bloqueo buscando y cerrando el descriptor de archivo abierto).

Para el caso de la pregunta, se debe interbloquear el comando que produce la línea de salida, teniendo en cuenta que esto invoca un externo echo en lugar de un shell integrado echo comando:

setlock mylockfile echo "$RESULT" >> ./$TEMP_DIR/$OUT_FILE

En este caso, no es necesario interbloquear la apertura del archivo de salida en el modo de adición. Si lo fuera, habría que abrir ese archivo dentro de la cerradura, lo que requiere el uso de programas como fdredir /redirfd :

setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" echo "$RESULT"
que se puede convertir en una función de shell si uno quiere:

outfile() { setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" "[email protected]" ; }
[…]
outfile echo "$RESULT"
o apegarse a la sintaxis de shell y hacer que la interprete un segundo shell que se ejecuta bajo el interbloqueo, 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'"'

Esto, por supuesto, se generaliza a otras cosas además de escribir en archivos de salida:

setlock mylockfile sh -c '… interlocked ; stuff …'


Linux
  1. Cómo escribir un bucle en Bash

  2. ¿Se puede conectar un script Bash a un archivo?

  3. ¿Actualizar el historial de Bash en otras terminales al salir de una terminal?

  4. ¿Escribir en un archivo .txt?

  5. Shell:escribe contenido variable en un archivo

Cómo leer un archivo línea por línea en Bash

Comando de fuente Bash

Bash:Agregar al archivo

Sustitución de cadena en Bash

35 ejemplos de secuencias de comandos Bash

Script Bash (III)