Ya, memang ada kondisi balapan di skrip sampel. Anda dapat menggunakan noclobber
bash opsi untuk mendapatkan kegagalan jika terjadi balapan, ketika skrip yang berbeda menyelinap di antara -f
test dan touch
.
Berikut adalah cuplikan kode sampel (terinspirasi oleh artikel ini) yang mengilustrasikan mekanismenya:
if (set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null;
then
# This will cause the lock-file to be deleted in case of a
# premature exit.
trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT
# Critical Section: Here you'd place the code/commands you want
# to be protected (i.e., not run in multiple processes at once).
rm -f "$lockfile"
trap - INT TERM EXIT
else
echo "Failed to acquire lock-file: $lockfile."
echo "Held by process $(cat $lockfile)."
fi
Coba perintah kawanan:
exec 200>"$LOCK_FILE"
flock -e -n 200 || exit 1
Ini akan keluar jika file kunci dikunci. Ini bersifat atomik dan akan berfungsi pada NFS versi terbaru.
Saya melakukan tes. Saya telah membuat file penghitung dengan 0 di dalamnya dan menjalankan yang berikut dalam satu lingkaran di dua server secara bersamaan sebanyak 500 kali:
#!/bin/bash
exec 200>/nfs/mount/testlock
flock -e 200
NO=`cat /nfs/mount/counter`
echo "$NO"
let NO=NO+1
echo "$NO" > /nfs/mount/counter
Satu node berkelahi dengan yang lain untuk mendapatkan kunci. Ketika keduanya berjalan selesai, konten file adalah 1000. Saya telah mencoba berkali-kali dan selalu berhasil!
Catatan:Klien NFS adalah RHEL 5.2 dan server yang digunakan adalah NetApp.
Kunci skrip Anda (terhadap proses paralel)
http://wiki.bash-hackers.org/howto/mutex
FYI.