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
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
Hızlı eğer string sadece rakam varsa k...
C fabrika desen#: Nasıl bir nesne örne...
Bir tamsayı'in kare kökü belirlem...
Nasıl tarih sadece SQL Server datetime...
Nasıl stil için bir <select> sad...