Sürüye birden fazla komut iletme


12
flock -x -w 5 ~/counter.txt 'COUNTER=$(cat ~/counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'

flockYukarıdaki örnekte olduğu gibi birden çok komutu nasıl iletirim?

Anladığım kadarıyla, flockfarklı bayraklar (özel için -x, zaman aşımı için -w), ardından kilitlenecek dosya ve ardından çalıştırılacak komut alır. Bu işleve nasıl iki komut geçireceğinden emin değilim (kilitli dosyanın içeriğiyle değişken ayarlayın ve sonra bu dosyayı artırın).

Buradaki amacım, bir komut dosyasının dosyaya her erişmeye çalıştığında dosyayı kilitleyerek bir miktar atomik artış yaratmaktır counter.txt.

Yanıtlar:


8

Bir mermiyi açıkça çağırın.

flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'

Değiştirdiğiniz herhangi bir değişkenin o kabuk örneği için yerel olduğunu unutmayın. Örneğin, COUNTERdeğişken çağrı komut dosyasında güncellenmez: dosyadan geri okumalısınız (ancak bu arada değişmiş olabilir) veya komutun çıktısı olarak:

new_counter=$(flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) | tee ~/counter.txt')

harika, çok teşekkürler! Sağladığınız açıklama beni bir saat daha baş ağrısından kurtardı
d -_- b

4

Veya bir dosya tanımlayıcıyı akın edebilirsiniz

exec {counterfd}<~/counter.txt
flock -x -w 5 "$counterfd"
COUNTER=$(cat ~/counter.txt)
COUNTER=$(( COUNTER +1 ))
echo "$COUNTER" >~/counter.txt
exec {counterfd}<&-

Bu ayrıca, alt kabuk tabanlı yaklaşımların aksine sayaç değişkenini doğrudan kullanmanıza izin verme avantajına sahiptir.


Lütfen açıklar exec {counterfd}mısınız? Debian kendi başına hata yapar not found, ancak yeniden yönlendirme ile 0 döndürür. Çok tuhaf.
Steve Almond

2

Aracın flockkullanımı biraz zor ve man sayfası oldukça kısa. Kılavuz sayfası, aracı kullanmanın üç yolunu sunar:

  • flock [options] <file|directory> <command> [command args]
  • flock [options] <file|directory> -c <command>
  • flock [options] <file descriptor number>

Bu sorunun nasıl ifade edildiğini kesinlikle üçüncü biçimini kullanacağım flock. Man sayfasında daha ileri giderseniz flock, üçüncü formu kullanmak için tam sözdizimini gösteren bazı örnekler vardır:

#!/bin/bash
(
 flock -n 9 || exit 1
 echo "commands executed under lock..."
 echo "go here..."
) 9>/tmp/mylockfile

Ekledim #!/bin/bash.

Bu formu başarıyla kullandım flock.

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.