2011-08-14 4 views
16

następujący mechanizm blokujący jest stosowany do zapobiegania cron pracy uruchamianiu równocześnie:atakujących trzody wyjścia Jeżeli nie można uzyskać zabezpieczenie

#!/bin/bash 

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

Po uruchomieniu dwóch wystąpień razem późniejsze czeka aż kończy się pierwsza i następnie biegnie. Może to spowodować zaległości skryptów oczekujących na uruchomienie.

Jak zmienić ten skrypt, aby flock nie mógł uzyskać blokady, to kończy skrypt? Próbowałem bez powodzenia -n.

Odpowiedz

20
flock -n -e 200 || exit 1 

flock -n mówi, że nie powiodła się zwracając kod błędu (coś innego niż zero). Zamiast tego możesz wpisać set -e u góry skryptu, aby zakończyć działanie po napotkaniu niesprawdzonego błędu.

W zależności od zastosowania, może być potrzebne exit 0 wskazanie powodzenia, gdy nie można uzyskać blokady.

12

Używamy wyłącznej blokady w samym pliku skryptu, $0 to nazwa pliku poleceń.

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

Całe rozwiązanie składa się z dwóch linii kodu. Ale sztuką jest otworzyć 0 dolarów za czytanie, a następnie uzyskać wyłączną blokadę dla niego.

+2

Byłoby miło udokumentować przypadki, kiedy może się to nie udać. Podejrzewam, że to się nie powiedzie, jeśli '0 0' zawiera spacje, i zawiedzie, jeśli' $ 0' nie zawiera ścieżki do uruchomionego skryptu (np. Skrypt jest gdzie indziej, ale na 'PATH'). – joeytwiddle

+0

$ 0 powinien nadal mieć ścieżkę, jeśli jest w $ PATH. Jeden przypadek, w którym nie działa, jest pod kreską. – steveayre

Powiązane problemy