Beispiel: Verwenden von Flock, um die serielle Ausführung von Skripten mit Dateisperren zu erzwingen
Ein Beispiel ist die Verwendung der Dateisperrung, um zu erzwingen, dass Skripts systemweit seriell ausgeführt werden. Dies ist nützlich, wenn Sie nicht möchten, dass zwei Skripte derselben Art mit denselben Dateien arbeiten. Andernfalls würden sich die beiden Skripte gegenseitig stören und möglicherweise Daten beschädigen.
#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>&-
Verwenden Sie Flock funktional, indem Sie Sperren und Entsperren definieren
Sie können diese Sperr- / Entsperrlogik auch in wiederverwendbare Funktionen einbinden. Die folgende integrierte trap
Shell hebt die Dateisperre automatisch auf, wenn das Skript beendet wird (entweder Fehler oder Erfolg). trap
Bereinigen Sie Ihre Dateisperren. Der Pfad /tmp/file.lock
sollte fest codiert sein, damit mehrere Skripte versuchen können, ihn zu sperren.
# 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>&-
}
Die unlock
obige Logik besteht darin, die Datei zu löschen, bevor die Sperre aufgehoben wird. Auf diese Weise wird die Sperrdatei bereinigt. Da die Datei gelöscht wurde, kann eine andere Instanz dieses Programms die Dateisperre erhalten.
Verwendung von Sperr- und Entsperrfunktionen in Skripten
Sie können es in Ihren Skripten wie im folgenden Beispiel verwenden.
#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
Wenn Sie möchten, dass Ihr Code wartet, bis er gesperrt werden kann, können Sie das Skript wie folgt anpassen:
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