Birisi bir dosyayı kilitlemek ve kilitli dosyaya yazmak için flock ve dosya tanımlayıcılarının nasıl kullanılacağını açıklayabilir mi?


14

flockAlet için yeni olduğum için bana çıplak ve bildiğim kadarıyla dosya tanımlayıcıları kullanmadım.

Bir cURL isteği yapar ve çıktı adlı bir dosyaya yazar bir bash komut dosyası var resp.txt. Bu dosyaya yazabilmek ve aynı anda komut dosyasını çalıştıran ve metin dosyasını düzenleyen birden fazla kullanıcı hakkında endişelenmemek için özel bir kilit oluşturmanız gerekiyor.

İşte dosyayı kilitlemek, isteği gerçekleştirmek ve metin dosyasına yazmak için beklediğim kod:

(
flock -e 200
curl 'someurl' -H 'someHeader' > resp.txt
) 200>/home/user/ITS/resp.txt

Bu konuda doğru bir yol var mı? Benim gerçek betiğim bundan biraz daha uzun, ama flockbash betiğine sözdizimi eklediğimde kırılıyor gibi görünüyor .

Birisi bu dosya tanımlayıcılarının nasıl çalıştığını açıklayabilir ve dosyayı doğru bir şekilde kilitleyip kilitlemediğimi bildirirseniz bu harika olurdu!

Yanıtlar:


8

Bu doğru değil çünkü bunu yaptığınızda ( flock -e 200; ... ) 200> file, özel kilidi file almadan önce dosyayı kesiyorsunuz . Yapmanız gerektiğini düşünüyorum:

touch resp.txt
(
  flock -e 200
  curl 'someurl' -H 'someHeader' > resp.txt
) 200< resp.txt

kilidi salt okunur olarak açılan dosyaya yerleştirmek için.

Not. Bazı kabuklar 9'dan büyük dosya tanımlayıcılarını desteklemez. Ayrıca, sabit kodlu dosya tanımlayıcı zaten kullanılabilir. Gelişmiş mermilerle (bash, ksh93, zsh) aşağıdakiler yapılabilir:

touch resp.txt
(
  unset foo
  exec {foo}< resp.txt
  flock -e $foo
  curl 'someurl' -H 'someHeader' > resp.txt
)

Ben olsa curl komut dosyaya yazmak gerekir. Nasıl flockçalıştığını yanlış anlıyor muyum? Dosya tanımlayıcılarında yeniyim: /
yeniyim DuckPuncher

1
@DuckPuncher Kilit mekanizması, dosya üzerinde yapabileceğiniz okuma / yazma işlemlerinden ayrıdır. Yani, curlyine de dosyaya yazabilirsiniz. Bunun NFS ile güvensiz olabileceğini (hatta çalışmayabileceğini), ancak NFS üzerinden dosya kilitleme için bir kabuk komut dosyası kullanmadığını unutmayın. İle bashdosyayı hem okumak hem de yazmak için de açabilirsiniz: 200<> resp.txtancak bu hiçbir şeyi değiştirmemelidir.
vinc17
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.