Чи безпечно flock & exec в баші?


13

"Стандартний" фрагмент блокування, який я бачив, має щось на зразок ...

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

Чи безпечно (тестування, здається, так) використовувати execв цей момент? Чи збереже підпроцес замок?

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

Я смутно пам'ятаю, що exec'd процеси зберігають відкриті дескриптори файлів, і оскільки flock використовує дескриптори файлів, це повинно працювати. Але я не можу знайти жодної документації, яка робить це остаточним і зрозумілим.

Для запису це характерно для Linux.

Відповіді:


3

Так, замки збереглися поперек exec. Блокування зберігаються в межах базового системного виклику execve, доки дескриптор файлу залишається відкритим. Дескриптори файлів залишаються відкритими, execveякщо тільки вони не були налаштовані для закриття в exec, а дескриптори файлів, створені перенаправленням оболонки, не позначаються як close-on-exec.


6

Так. Exec просто замінює зображення процесу, але це все одно той самий процес, тож пов'язані з ним блокування на рівні ОС залишаються колишніми.

Переконатися, що він працює, дуже просто:

замок

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

сценарій

sleep 100

Спробуйте запустити ./lockдвічі протягом наступних 100 секунд. Ви отримаєте замок лише один раз, ерго execне відпускає замок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.