Операции с каталогами НЕ атомарные в NFSv2 и NFSv3
(пожалуйста, обратитесь к книге «NFS Illustrated» Брента Каллагана,
ISBN 0-201-32570-5; Брент - ветеран NFS на Солнце).
NFSv2 имеет две атомарные операции:
- символическая
- переименование
В NFSv3 вызов create также является атомарным.
Зная это, вы можете реализовать спин-блокировки для файлов и
каталоги (в оболочке, а не в PHP):
блокировка текущего каталога:
while ! ln -s . lock; do :; done
заблокировать файл:
while ! ln -s ${f} ${f}.lock; do :; done
разблокировка (при условии, что запущенный процесс действительно получил блокировку):
разблокировать текущий каталог:
mv lock deleteme && rm deleteme
разблокировать файл:
mv ${f}.lock ${f}.deleteme && rm ${f}.deleteme
Удалить тоже не атомарно, поэтому сначала переименуем (которое
атомарный), а затем удалить.
Для вызовов символической ссылки и переименования оба имени файла должны находиться на
та же файловая система. Мое предложение: использовать только простые имена файлов и поставить
файл и заблокировать в том же каталоге.