Flock es un utilitario que nos permite adquirir un lock exclusivo durante la ejecución de un script, esto nos permite ejecutar el mismo script varias veces sin suporponer la ejecución de los comandos que se invocan, es decir solo se va a ejecutar los comandos especificados en el script si no hay un proceso anterior corriendo.
Vamos a explicarlo a través de un ejemplo: un cliente me solicitó realizar una sincronización de un servidor a otro, esta sincronización debía realizarse cada 2 minutos, pero en algunas ocaciones mientras un proceso estaba ejecutándose se lanzaba un segundo proceso de sincronización provocando que hubieran varios rsync ejecutándose al mismo tiempo y tratando de sincronizar los mismos recursos, en un momento determinado había varios rsync ejecutándose y consumiendo recursos del servidor, entonces debíamos encontrar una solución que permitiera ejecutar la sincronización solo si no había una sincronización anterior ejecutándose y vino el comando flock al rescate.
El siguiente ejemplo muestra como usar el comando flock.
#!/usr/bin/env bash
(
flock -n 9 || exit 1
# Comandos a ejecutar bajo el lock
echo Obtener lock...
sleep 5
echo Liberar lock
) 9> /var/tmp/my.lock
Primero obtenemos el lock pasando el número de descriptor del fichero puede ser cualquier valor, si se obtiene el lock entonces se procede a ejecutar los comandos siguientes, en caso de no obtener el lock el script termina la ejecución con código de salida 1.
Lecturas de interés
- man flock