Когда необходимо синхронизировать программы (сценарии оболочки) через файловую систему, я нашел решение на основе flock
, которое рекомендуется (должно также работают в NFS). Канонический пример использования внутри сценария (из http://linux.die.net/man/1/flock):
(
flock -s 200
# ... commands executed under lock ...
) 200>/var/lock/mylockfile
Я не совсем понимаю, почему вся эта конструкция обеспечивает атомарность. В частности, мне интересно, в каком порядке выполняются flock -s 200
и 200>/var/lock/mylockfile
, например, когда bash
выполняет эти строки кода. Этот порядок гарантирован / детерминирован? Насколько я понимаю, это должно быть детерминированным, если эта идиома должна работать. Но поскольку подчиненная оболочка порождается в дочернем процессе, я не понимаю, как эти два процесса синхронизируются. Я уже вижу только состояние гонки между этими двумя командами.
Я был бы признателен, если бы кто-нибудь мог заставить мое замешательство по этому поводу исчезнуть и объяснить, почему эту конструкцию можно использовать для безопасной синхронизации процессов.
В то же время, если кто-то знает, мне было бы интересно узнать, насколько безопасно выбрать какой-нибудь произвольный файловый дескриптор (например, 200
в примере), особенно в контексте большой файловой системы NFS с большим количеством клиентов.