SORU
9 EKİM 2008, PERŞEMBE


Hızlı-ve-kirli bir kabuk sadece bir örnek sağlamak için yol bir anda çalışıyor

Bir kabuk sadece bir örnek, belirli bir anda olduğundan emin olmak için hızlı ve kirli bir yol nedir?

CEVAP
8 NİSAN 2009, ÇARŞAMBA


Tüm dosyalar "kusurlu." kilit varlığını test yaklaşımları

Neden? Tek bir atom bir eylem bir dosya olup olmadığını kontrol etmek ve oluşturmak için bir yol yoktur çünkü. Bu nedenle; bir yarış durumu varkarşılıklı dışlama çabalarını ayrılık.

Bunun yerine, mkdir kullanmak gerekir. mkdir Eğer Henüz mevcut değil, eğer bir dizin oluşturur, ve eğer varsa, bir çıkış kodu ayarlar. Daha da önemlisi, tek bir atomik işlem bu senaryo için mükemmel tüm bu yok.

if ! mkdir /tmp/myscript.lock 2>/dev/null; then
    echo "Myscript is already running." >&2
    exit 1
fi

Tüm ayrıntılar için, mükemmel BashFAQ bakın: http://mywiki.wooledge.org/BashFAQ/045

Eğer bayat kilitleri bakmak isterseniz, ısıtıcı(1) kullanışlı oluyor. Tek dezavantajı burada işlemi yaklaşık bir saniye sürer, anlık değil yani.

Sorun su ısıtıcı kullanarak çözen bir zamanlar yazdığım bir fonksiyonu

#       mutex file
#
# Open a mutual exclusion lock on the file, unless another process already owns one.
#
# If the file is already locked by another process, the operation fails.
# This function defines a lock on a file as having a file descriptor open to the file.
# This function uses FD 9 to open a lock on the file.  To release the lock, close FD 9:
# exec 9>&-
#
mutex() {
    local file=$1 pid pids 

    exec 9>>"$file"
    { pids=$(fuser -f "$file"); } 2>&- 9>&- 
    for pid in $pids; do
        [[ $pid = $$ ]] && continue

        exec 9>&- 
        return 1 # Locked by a pid.
    done 
}

Böyle bir komut dosyası kullanabilirsiniz

mutex /var/run/myscript.lock || { echo "Already running." >&2; exit 1; }

Eğer taşınabilirlik (Bu çözümleri hemen hemen her UNİX kutusu) üzerinde çalışması gerekir umrunda bile,' ısıtıcı(1) bazı ek seçenekler sunar ve ayrıca akın var(1). Linux

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Distractify

    Distractify

    1 Aralık 2011
  • hydejiaqi

    hydejiaqi

    12 Mart 2008
  • TheXiaxue

    TheXiaxue

    3 AĞUSTOS 2009