2011-08-14 15 views
16

aşağıdaki kilit mekanizması eş zamanlı çalışan bir cron iş önlemek için kullanılır:,bash sürüsü: çıkış elde edemez eğer kilit

#!/bin/bash 

echo "Before critical section" 
(
    flock -e 200 
    echo "In critical section" 
    sleep 5 
) 200>/tmp/blah.lockfile 
echo "After critical section" 

birlikte iki örneğini çalıştıran, daha sonra bekler ilk bitene kadar ve o zaman çalışır. Bu, çalışmayı bekleyen komut dosyalarının yığılmasına neden olabilir. flock kilidi elde edemez, eğer senaryoyu sonlandırır böylece

Nasıl bu senaryoyu değiştirecek mi? Başarı olmadan -n denedim.

cevap

20
flock -n -e 200 || exit 1 

flock -n bunu bir başarısızlık kodu (sıfırdan farklı bir şey) döndürerek başarısız söyler. Bunun yerine herhangi bir kontrolsüz bir hata gördüğünde onu çıkmak yapmak için komut üstündeki set -e yapabilirdi.

uygulamanıza bağlı olarak, kilit kazanılmış edilemez zaman başarıyı göstermek için exit 0 isteyebilirsiniz.

12

Biz komut dosyası kendisi üzerinde özel kilit kullanın $0 komut dosyasının adıdır.

exec 200<$0 
flock -n 200 || exit 1 

Tüm çözüm iki satırlık koddadır. Ancak hile, okumak için 0 $ açmak ve bunun için özel kilit elde etmektir.

+2

başarısız zaman belgelenmesi güzel olurdu. Ben '$ 0' boşluk içeriyorsa o başarısız olur şüpheli ve' $ 0' çalışan bir komut dosyası yolunu içermiyorsa o başarısız olur (örneğin komut başka bir yerde ama 'PATH' üzerindedir). – joeytwiddle

+0

$ 0, $ PATH ise hala yolu olmalıdır. Çalışılmadığı bir durum çizgi altında. – steveayre