Ví dụ: sử dụng bầy để buộc các tập lệnh chạy ser seri với khóa tập tin
Một ví dụ là sử dụng khóa tệp để buộc các tập lệnh chạy toàn hệ thống. Điều này hữu ích nếu bạn không muốn hai tập lệnh cùng loại hoạt động trên cùng một tệp. Nếu không, hai tập lệnh sẽ can thiệp lẫn nhau và có thể dữ liệu bị hỏng.
#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>&-
Sử dụng đàn theo chức năng bằng cách xác định khóa và mở khóa
Bạn cũng có thể gói logic khóa / mở khóa này vào các chức năng có thể sử dụng lại. Nội dung trap
shell sau đây sẽ tự động giải phóng khóa tệp khi tập lệnh thoát (lỗi hoặc thành công). trap
giúp dọn dẹp ổ khóa tập tin của bạn. Đường dẫn /tmp/file.lock
phải là một đường dẫn được mã hóa cứng để nhiều tập lệnh có thể cố gắng khóa trên nó.
# 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>&-
}
Các unlock
logic ở trên là để xóa các tập tin trước khi khóa được phát hành. Bằng cách này, nó làm sạch các tập tin khóa. Vì tệp đã bị xóa, một phiên bản khác của chương trình này có thể có được khóa tệp.
Sử dụng các chức năng khóa và mở khóa trong các tập lệnh
Bạn có thể sử dụng nó trong các kịch bản của bạn như ví dụ sau đây.
#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
Nếu bạn muốn mã của mình đợi cho đến khi có thể khóa, bạn có thể điều chỉnh tập lệnh như:
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