Örnek: komut dosyalarını seri kilitlerle dosya kilitleriyle çalıştırmaya zorlamak için sürü kullanmak
Bunun bir örneği, komut dizilerini seri olarak sistem genelinde çalışmaya zorlamak için dosya kilitlemeden yararlanmaktır. Bu, aynı türden iki komut dosyasının aynı dosyalar üzerinde çalışmasını istemiyorsanız kullanışlıdır. Aksi takdirde, iki komut dosyası birbiriyle karışır ve muhtemelen bozuk verilerle sonuçlanır.
#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>&-
Kilit ve kilidi açarak işlevsel olarak sürüyü kullanın.
Bu kilitleme / açma mantığını tekrar kullanılabilir fonksiyonlara sarabilirsiniz. Aşağıdaki trap
kabuk yerleşik kodu , komut dosyası çıktıktan sonra otomatik olarak dosya kilidini açar (hata veya başarı). trap
dosya kilitlerini temizlemeye yardımcı olur. Yol /tmp/file.lock
, kodlanmış bir yol olmalıdır, böylece birden fazla komut dosyası kilitlemeye çalışabilir.
# 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>&-
}
Yukarıdaki unlock
mantık, kilit serbest bırakılmadan önce dosyayı silmektir. Bu sayede kilit dosyasını temizler. Dosya silindiğinden, bu programın başka bir örneği dosya kilidini elde edebilir.
Kodlarda kilitleme ve kilit açma fonksiyonlarının kullanımı
Aşağıdaki örnekte olduğu gibi komut dosyalarınızda kullanabilirsiniz.
#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
Kodunuzun kilitleninceye kadar beklemesini istiyorsanız, komut dosyasını aşağıdaki gibi ayarlayabilirsiniz:
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