Eu deriguei um script bash de amostra do que vi por aí, em relação à flock
função bash. Eu faço:
func()
{
42>/home/foo
flock -e 42 || exit 1
echo "hello world"
sleep 5
}
Em seguida, executo consecutivamente func&
, cada um dos quais imprime hello world
imediatamente, enquanto espero que o primeiro imprima a mensagem e o restante saia. O que estou perdendo aqui?
Considere este exemplo, baseado no exemplo da
flock
página de manual:Agora, se eu executar esse script uma vez:
Se eu executar duas instâncias nessa janela de suspensão de 10 segundos desse script, a primeira em segundo plano, uma possível sequência de eventos é:
Neste exemplo, o segundo processo venceu a corrida e adquiriu o bloqueio primeiro. Em seguida, liberou o bloqueio e permitiu que o primeiro processo (o segundo plano) adquirisse e, em seguida, liberou o bloqueio.
Posso melhorar as chances de o primeiro processo vencer a corrida introduzindo um atraso entre iniciá-los: