Contoh: menggunakan kawanan untuk memaksa skrip dijalankan secara seri dengan kunci file
Salah satu contoh adalah dengan menggunakan penguncian file untuk memaksa skrip untuk menjalankan sistem seri lebar. Ini berguna jika Anda tidak ingin dua skrip dari jenis yang sama beroperasi pada file yang sama. Jika tidak, kedua skrip akan saling mengganggu dan kemungkinan data korup.
#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>&-
Gunakan kawanan secara fungsional dengan mendefinisikan kunci dan membuka kunci
Anda juga dapat menggunakan logika penguncian / penguncian ini menjadi fungsi yang dapat digunakan kembali. trap
Shell bawaan berikut akan secara otomatis melepaskan kunci file ketika skrip keluar (kesalahan atau berhasil). trap
membantu membersihkan kunci file Anda. Path /tmp/file.lock
harus berupa jalur kode keras sehingga banyak skrip dapat mencoba untuk menguncinya.
# 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>&-
}
The unlock
logika di atas adalah untuk menghapus file sebelum mengunci dilepaskan. Dengan cara ini membersihkan file kunci. Karena file itu dihapus, contoh lain dari program ini dapat memperoleh kunci file.
Penggunaan fungsi kunci dan buka kunci dalam skrip
Anda dapat menggunakannya dalam skrip Anda seperti contoh berikut.
#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
Jika Anda ingin kode Anda menunggu hingga dapat mengunci, Anda dapat menyesuaikan skrip seperti:
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