O bloqueio de arquivos é feito com flock(2)
e amigos e, convenientemente, há um wrapper de script de shell para ele. Para testar se os bloqueios de arquivo funcionam, você abre dois terminais e executa isto:
No terminal um:
flock /path/to/lockfile sleep 120
E no outro terminal enquanto o primeiro está segurando o bloqueio:
if ! flock -n /tmp/foo.lock true ; then echo "flock works"; else echo "flock fails"; fi
Isso deve informar se os bloqueios de arquivos funcionam.
E se você precisar executá-lo em um script, tente o seguinte:
flock /path/to/lockfile sleep 120 &
if ! flock -n /tmp/foo.lock true ; then echo "flock works"; else echo "flock fails"; fi
kill $!
Outra maneira de bloquear arquivos é a chamada do sistema fcntl
. É bastante irritante testar com o ruby, mas esse código em Python deve funcionar:
import fcntl, os, time
fd = open('/tmp/test.lock', 'w')
if os.fork():
fcntl.lockf(fd, fcntl.LOCK_EX)
os.wait()
else:
time.sleep(0.1)
fcntl.lockf(fd, fcntl.LOCK_EX|fcntl.LOCK_NB)
Ele tenta bloquear o mesmo arquivo em dois processos diferentes. O segundo bloqueio não é bloqueado, portanto, deve imediatamente gerar um erro. A saída esperada, se os bloqueios fcntl estiverem funcionando corretamente, é:
Traceback (most recent call last):
File "test.py", line 12, in <module>
fcntl.lockf(fd, fcntl.LOCK_EX|fcntl.LOCK_NB)
IOError: [Errno 11] Resource temporarily unavailable