У меня есть файл results.txt
на сервере, к которому обращаются несколько виртуальных машин через NFS. На каждой из этих виртуальных машин запускается процесс, который считывает файл results.txt
и изменяет его. Если два процесса, A
и B
, читают файл одновременно, то модификация A или B будет присутствовать в results.txt
в зависимости от порядка записи процессов в файл.
Если процесс A
имеет блокировку записи в файле, то процессу B
придется ждать снятия блокировки, чтобы прочитать файл results.txt
.
Я попытался реализовать это с помощью Python:
import fcntl
f = open("/path/result.txt")
fcntl.flock(f,fcntl.LOCK_EX)
#code
Он работает должным образом для файлов на локальном диске.
но когда я запускаю попытку заблокировать файл по смонтированному пути, я получаю следующую ошибку:
Traceback (most recent call last):
File "lock.py", line 12, in <module>
fcntl.flock(f,fcntl.LOCK_EX)
IOError: [Errno 45] Operation not supported
Я пробовал fcntl.fcntl
и fcntl.flock
, но получил ту же ошибку. Это проблема с тем, как я использую fcntl
? Требуется ли какая-либо настройка на сервере, где хранится файл?
Изменить:
Вот как я использую fcntl.fcntl
:
f= open("results.txt")
lockdata = struct.pack('hhllhh', fcntl.F_RDLCK,0,0,0,0,0)
rv = fcntl.fcntl(f, fcntl.F_SETLKW, lockdata)
Версия сервера NFS — 3.
fcntl.fcntl()
? - person vmonteco   schedule 09.06.2016fcntl.fcntl(f, fcntl.LOCK_EX)
работает? - person vmonteco   schedule 09.06.2016