Después de revisar la documentación de bash , esta pregunta y esta todavía no me queda claro cómo puedo realizar operaciones de escritura atómica (agregar) a un archivo en bash. Tengo un script que se ejecuta en varias instancias y en algún momento debo escribir datos en un archivo:
echo "$RESULT" >> `pwd`/$TEMP_DIR/$OUT_FILE
¿Cómo es posible hacer que todas las operaciones de escritura de todos los scripts que se ejecutan simultáneamente en ese archivo sean atómicas (para que los datos de una instancia no se superpongan con los de otra)?
linux
bash
command-line
semaphore
Sebi
fuente
fuente
`pwd`
; puedes usar un punto (.
). También debe citar ese nombre de archivo completo ya que incluye variables .pwd
anteriormente en el script para notificar al usuario sobre el directorio de trabajo actual y también escribir entradas en un archivo de registro. mirando por encima de FIFOs ahora.mkfifo
y no exactamente el nivel introductorio.Respuestas:
Parece que necesita usar
flock
como en el ejemplo de man ( http://linux.die.net/man/1/flock )Y ponga todos sus comandos que deben ser atómicos en ().
fuente
/var/lock/mylockfile
esté disponible para el bloqueo./var/lock/mylockfile
el proceso que llamóflock -x
?(flock -x 200; date; sleep 10; date;) 200>/var/lock/mylockfile
en dos shells y ver que los desbloqueos ocurren solo después de que se ejecutan todos los comandos en () (es decir, en una subshell)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 lasetlock
utilidad de Daniel J. Bernstein de su paquete daemontools:setlock
de daemontoolssetlock
de daemontools-encore de Bruce Guenters6-setlock
del s6 de Laurent Bercotchpst
del runit de Gerrit Paperunlock
del asesino de Wayne Marshallsetlock
de mi conjunto de herramientas noshEstas 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 elsetlock
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 unecho
comando incorporado de shell :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
cuál se puede convertir en una función de shell si se quiere: 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:fdredir
/redirfd
:Por supuesto, esto se generaliza a otras cosas además de escribir en archivos de salida:
fuente