Czy flock & exec jest bezpieczny w bash?


13

„Standardowy” fragment blokujący, który widziałem, wygląda mniej więcej tak ...

(
    flock -n 200 || exit 1;
    # do stuff
) 200>program.lock

Czy korzystanie z niego execw tym momencie jest bezpieczne (wydaje się, że testy tak mówią) ? Czy podproces zachowa blokadę?

(
    flock -n 200 || exit 1;
    exec /usr/bin/python vendors-notcoolstuff.py
) 200>program.lock

Niejasno pamiętam, że uruchomione procesy zachowują otwarte deskryptory plików, a ponieważ flock używa deskryptorów plików, powinien działać. Ale nie mogę znaleźć żadnej dokumentacji, która by to była ostateczna i jasna.

Dla przypomnienia, jest to specyficzne dla Linuksa.

Odpowiedzi:


3

Tak, zamki są zachowane w poprzek exec. Blokady są zachowywane w bazowym wywołaniu systemowym execve, dopóki deskryptor pliku pozostaje otwarty. Deskryptory plików pozostają otwarte, o execveile nie zostały skonfigurowane do zamykania przy exec, a deskryptory plików utworzone przez przekierowanie powłoki nie są oznaczone jako close-on-exec.


6

Tak to jest. Exec po prostu zastępuje obraz procesu, ale wciąż jest to ten sam proces, więc związane z nim blokady na poziomie systemu operacyjnego pozostają takie same.

Bardzo łatwo jest sprawdzić, czy działa:

zamek

(
    flock -n 200 || exit 1;
    echo "locked"
    exec ./script
) 200>program.lock

scenariusz

sleep 100

Spróbuj uruchomić ./lockdwa razy w ciągu następnych 100 sekund. Blokadę otrzymasz tylko raz, ergo execnie zwalnia blokady.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.