Ejemplo: uso de flock para forzar que los scripts se ejecuten en serie con bloqueos de archivos
Un ejemplo es hacer uso del bloqueo de archivos para forzar que los scripts se ejecuten en serie en todo el sistema. Esto es útil si no desea que dos scripts del mismo tipo operen en los mismos archivos. De lo contrario, los dos scripts interferirían entre sí y posiblemente dañarían los datos.
#exit if any command returns a non-zero exit code (like flock when it fails to lock)
set -e
#open file descriptor 3 for writing
exec 3> /tmp/file.lock
#create an exclusive lock on the file using file descriptor 3
#exit if lock could not be obtained
flock -n 3
#execute serial code
#remove the file while the lock is still obtained
rm -f /tmp/file.lock
#close the open file handle which releases the file lock and disk space
exec 3>&-
Use el lote funcionalmente definiendo bloquear y desbloquear
También puede incluir esta lógica de bloqueo / desbloqueo en funciones reutilizables. El siguiente trap
shell incorporado liberará automáticamente el bloqueo del archivo cuando salga el script (ya sea error o éxito). trap
ayuda a limpiar tus bloqueos de archivos. La ruta /tmp/file.lock
debe ser una ruta codificada para que varios scripts puedan intentar bloquearla.
# obtain a file lock and automatically unlock it when the script exits
function lock() {
exec 3> /tmp/file.lock
flock -n 3 && trap unlock EXIT
}
# release the file lock so another program can obtain the lock
function unlock() {
# only delete if the file descriptor 3 is open
if { >&3 ; } &> /dev/null; then
rm -f /tmp/file.lock
fi
#close the file handle which releases the file lock
exec 3>&-
}
La unlock
lógica anterior es eliminar el archivo antes de liberar el bloqueo. De esta manera, limpia el archivo de bloqueo. Debido a que el archivo fue eliminado, otra instancia de este programa puede obtener el bloqueo del archivo.
Uso de funciones de bloqueo y desbloqueo en scripts
Puede usarlo en sus scripts como en el siguiente ejemplo.
#exit if any command returns a non-zero exit code (like flock when it fails to lock)
set -e
#try to lock (else exit because of non-zero exit code)
lock
#system-wide serial locked code
unlock
#non-serial code
Si desea que su código espere hasta que pueda bloquearse, puede ajustar el script como:
set -e
#wait for lock to be successfully obtained
while ! lock 2> /dev/null; do
sleep .1
done
#system-wide serial locked code
unlock
#non-serial code