man/files
man · Dosyalar

$ lockf

Bölüm 1 · Dosyalar

bir dosya kilidini tutarken komut yürütür

Özet

lockf [-knsw] [-t saniye] dosya komut [argümanlar]
lockf [-s] [-t saniye] fd

Açıklama

lockf yardımcı programı, gerektiğinde bir kilit dosyası oluşturarak üzerinde özel (exclusive) bir kilit elde eder ve aksi açıkça belirtilmediği sürece (-k parametresi verilmedikçe) çıkışta dosyayı kaldırır. Kilidi tuttuğu süre boyunca, isteğe bağlı argümanlara sahip belirtilen komutu yürütür. Komut tamamlandıktan sonra kilidi serbest bırakır ve kilit dosyasını temizler. flock(2) içinde açıklandığı gibi BSD tarzı kilitleme kullanılır; dosyanın sadece var olması bir kilit oluşturduğu şeklinde kabul edilmez.

lockf, bir dosya yolu yerine doğrudan bir dosya tanımlayıcısı (file descriptor - fd) üzerinde işlem yapmak için de kullanılabilir. Hiçbir komut sağlanmazsa, geçirilen değer bir dosya tanımlayıcısı olmalıdır. Komut içeren sürüm, istenen dosya tanımlayıcısı N olmak üzere /dev/fd/N yolu olarak sağlanarak bir dosya tanımlayıcısı ile de kullanılabilir. Bir dosya tanımlayıcısı kullanılırken -k seçeneği doğrudan varsayılır ve -n ile -w seçenekleri sessizce yoksayılır. Bu yöntem özellikle kabuk betikleri içinde kilitleme yapmak için son derece kullanışlıdır.

lockf aracı bir dizi süreç arasındaki eşzamanlılığı kolaylaştırmak için kullanılıyorsa, -k seçeneğinin kullanılması önemle tavsiye edilir. Bu seçenek, kilit sıralamasını garanti altına almanın yanı sıra eşzamanlı bağlantıyı kesme (unlink), bırakma ve yeniden elde etme faaliyetleriyle ilişkili CPU yükünü en aza indiren yüksek performanslı bir algoritma uygular. -k seçeneği kullanılmazsa, süreçler arasında kilit alma sırasıyla ilgili hiçbir garanti verilemez.

[!WARNING] lockf hiçbir koşulda başka bir süreç tarafından aktif olarak tutulan bir kilidi zorla kırmaz.

Seçenekler

  • -k: Komut tamamlandıktan sonra kilit dosyasının tutulmasını (silinmemesini) sağlar. Sıralı kilit işlemleri ve performans için önerilir.
  • -s: Sessiz (silent) modda çalışmasını sağlar. Kilidin elde edilememesi gibi durumlar standart hataya yazdırılmaz, yalnızca çıkış durumu (exit status) ile belirtilir.
  • -n: Belirtilen kilit dosyası mevcut değilse lockf'in başarısız olmasına neden olur. Belirtilmemişse, lockf gerektiğinde kilit dosyasını otomatik olarak oluşturur.
  • -t saniye: Kilit elde etmek için maksimum bekleme zaman aşımını (timeout) belirtir. Varsayılan olarak lockf kilidi elde edene kadar süresiz bekler. Zaman aşımı verilirse, en fazla belirtilen saniye kadar bekler. Zaman aşımı değeri 0 verilebilir; bu durumda kilit hemen elde edilemezse anında başarısız olur. Zaman aşımı durumunda komut yürütülmez.
  • -w: lockf'in kilit dosyasını okumak (read) yerine yazmak (write) için açmasını sağlar. Bu, salt okunur olarak açılan bir dosyanın özel olarak kilitlenemediği dosya sistemlerinde (NFSv4 dahil) gereklidir.

Çıkış Durumu

lockf kilidi başarıyla elde ederse, çalıştırılan komut tarafından döndürülen çıkış durumunu iletir. Kilit elde edilemezse veya bir hata oluşursa, sysexits(3) standartlarına uygun olarak aşağıdaki çıkış kodlarından birini döndürür:

Çıkış Kodu Sabit İsmi Açıklama
69 EX_UNAVAILABLE -n seçeneği belirtilmiş ancak kilit dosyası mevcut değil.
73 EX_CANTCREAT Yetersiz erişim izinleri vb. nedenlerle kilit dosyası oluşturulamadı.
75 EX_TEMPFAIL Belirtilen kilit dosyası başka bir süreç tarafından zaten kilitlenmişti.
64 EX_USAGE lockf komut satırı argümanlarında hatalı veya eksik kullanım var.
71 EX_OSERR Bir sistem çağrısı (örneğin fork(2)) beklenmedik şekilde başarısız oldu.
70 EX_SOFTWARE Çalıştırılan komut normal şekilde çıkış yapmadı; sinyal almış veya durdurulmuş olabilir.

Örnekler

Aşağıdaki örnekler kabukta (shell) çalıştırılabilecek şekilde gösterilmiştir:

  1. İlk iş arka planda bir kilit alır ve 5 saniye uyur; ikinci iş kilidi almaya çalışır ve 1 saniye sonra zaman aşımına uğrar:

    lockf mylock sleep 5 & lockf -t 1 mylock echo "Success"

    Çıktı örneği:

    [1] 94410
    lockf: mylock: already locked
  2. İlk iş arka planda bir kilit alır ve 1 saniye uyur; ikinci iş ise kilidi almak için 5 saniyeye kadar bekler ve kilit açılınca çalışır:

    lockf mylock sleep 1 & lockf -t 5 mylock echo "Success"

    Çıktı örneği:

    [1] 19995
    Success
    [1]+  Done             lockf mylock sleep 1
  3. Bir kilit dosyası kullanarak betiği çalıştırma, kilit meşgulse beklemeden (-t 0) çıkma ve kilit dosyası silinmesini önleme (-k):

    lockf -t 0 -k /tmp/my.lock myscript.sh
  4. Bir kabuk betiğinin kritik bir bölümünü dosya tanımlayıcısı (FD 9) üzerinden kilitleme:

    (
        lockf -s -t 5 9
        if [ $? -ne 0 ]; then
            echo "Hata: Başka bir işlem devam ediyor, kilit elde edilemedi."
            exit 1
        fi
    
        echo "Kritik bölüm başladı..."
        # Güvenli bir şekilde yapılacak eşzamanlı işlemler
        sleep 3
        echo "Kritik bölüm tamamlandı."
    ) 9>/tmp/my.lock

    [!NOTE] Bu örnekte, kabuk betiği /tmp/my.lock dosyasını 9 numaralı dosya tanımlayıcısı ile açar ve lockf kilidi bu açık tanımlayıcı üzerinden alır. Bu kullanım modunda -k otomatik olarak etkinleşir ve dosya silinmez.

Ayrıca Bakınız

flock(2), lockf(3), sysexits(3)

Yazarlar

John Polstra <jdp@polstra.com> tarafından geliştirilmiştir.