GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menghindari kondisi balapan saat menggunakan file kunci untuk menghindari dua contoh skrip berjalan secara bersamaan?

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.


Linux
  1. Bagaimana cara mendeteksi Virtualisasi menggunakan Sys::Detect::Virtualization Perl script?

  2. Bagaimana Cara Mengatur Parameter Saat Pipa Bash Script Ke Bash?

  3. Bagaimana cara menulis karakter non-ASCII menggunakan gema?

  1. Edit skrip shell saat sedang berjalan

  2. Bagaimana cara menghindari pesan peringatan 'adalah file yang sama' saat menggunakan cp di Linux?

  3. Bagaimana cara melihat pekerjaan cron yang sedang berjalan?

  1. Bagaimana Cara Membuat Animasi Rotasi Menggunakan Shell Script?

  2. Bagaimana cara menjalankan skrip pada kunci/buka kunci layar?

  3. qemu berjalan di ssh:bagaimana cara keluar?