ตัวอย่าง: การใช้ flock เพื่อบังคับให้สคริปต์รันพร้อมกับการล็อคไฟล์
ตัวอย่างหนึ่งคือการใช้การล็อกไฟล์เพื่อบังคับให้สคริปต์รันทั้งระบบตามลำดับ สิ่งนี้มีประโยชน์หากคุณไม่ต้องการให้สคริปต์สองตัวที่เป็นชนิดเดียวกันทำงานในไฟล์เดียวกัน มิฉะนั้นสคริปต์ทั้งสองจะรบกวนซึ่งกันและกันและข้อมูลที่อาจเสียหาย
#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>&-
ใช้ฝูงทำงานโดยการกำหนดล็อคและปลดล็อค
นอกจากนี้คุณยังสามารถรวมตรรกะการล็อค / ปลดล็อกนี้ไว้ในฟังก์ชั่นที่ใช้ซ้ำได้ trap
บิวด์เชลล์ต่อไปนี้จะปลดล็อกไฟล์โดยอัตโนมัติเมื่อสคริปต์ออก (ข้อผิดพลาดหรือสำเร็จ) trap
ช่วยทำความสะอาดล็อคไฟล์ของคุณ เส้นทาง/tmp/file.lock
ควรเป็นเส้นทางที่มีการเข้ารหัสอย่างหนักเพื่อให้สคริปต์หลายรายการสามารถลองล็อคได้
# 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>&-
}
unlock
ตรรกะข้างต้นคือการลบไฟล์ก่อนที่จะปลดล็อคตัวล็อค วิธีนี้จะทำการล้างไฟล์ล็อค เนื่องจากไฟล์ถูกลบอินสแตนซ์อื่นของโปรแกรมนี้สามารถขอรับการล็อกไฟล์ได้
การใช้ฟังก์ชั่นล็อคและปลดล็อคในสคริปต์
คุณสามารถใช้มันในสคริปต์ของคุณเช่นตัวอย่างต่อไปนี้
#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
หากคุณต้องการให้รหัสของคุณรอจนกว่าจะสามารถล็อคคุณสามารถปรับสคริปต์เช่น:
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