bash concurrency flock

bash - #!/ bin csh



bash rebaƱo: salir si no puede adquirir el bloqueo (2)

El siguiente mecanismo de bloqueo se usa para evitar que una tarea cron ejecute simultáneamente:

#!/bin/bash echo "Before critical section" ( flock -e 200 echo "In critical section" sleep 5 ) 200>/tmp/blah.lockfile echo "After critical section"

Cuando se ejecutan dos instancias juntas, la última espera hasta que finaliza la primera, y luego se ejecuta. Esto puede hacer que los trabajos pendientes de espera se ejecuten.

¿Cómo modifico este script para que si flock no pueda adquirir el bloqueo, finalice el script? Lo he intentado sin éxito.


Usamos el bloqueo exclusivo en el archivo de script, $0 es el nombre del archivo de comando.

exec 200<$0 flock -n 200 || exit 1

La solución completa está en dos líneas de código. Pero el truco es abrir $ 0 para leer y luego obtener un bloqueo exclusivo para ello.


flock -n -e 200 || exit 1

flock -n le dice que falló al devolver un código de falla (que no sea cero). En su lugar, podría set -e en la parte superior de su secuencia de comandos para que se cierre cuando vea un error sin verificar.

Dependiendo de su aplicación, es posible que desee exit 0 para indicar el éxito cuando no se puede obtener el bloqueo.