Esempio: utilizzo di flock per forzare l'esecuzione in serie degli script con blocchi dei file
Un esempio è quello di utilizzare il blocco dei file per forzare l'esecuzione degli script a livello di sistema in serie. Ciò è utile se non si desidera che due script dello stesso tipo operino sugli stessi file. Altrimenti, i due script interferirebbero tra loro e probabilmente con i dati corrotti.
#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>&-
Utilizzare il gregge in modo funzionale definendo blocco e sblocco
Puoi anche avvolgere questa logica di blocco / sblocco in funzioni riutilizzabili. Il seguente trap
built-in della shell rilascerà automaticamente il blocco del file alla chiusura dello script (errore o esito positivo). trap
aiuta a ripulire i blocchi dei file. Il percorso /tmp/file.lock
dovrebbe essere un percorso codificato in modo tale che più script possano provare a bloccarlo.
# 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
logica sopra è eliminare il file prima che il blocco venga rilasciato. In questo modo pulisce il file di blocco. Poiché il file è stato eliminato, un'altra istanza di questo programma è in grado di ottenere il blocco dei file.
Utilizzo delle funzioni di blocco e sblocco negli script
Puoi usarlo nei tuoi script come nell'esempio seguente.
#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
Se vuoi che il tuo codice aspetti fino a quando non è in grado di bloccare, puoi regolare lo script come:
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