Considere este exemplo, com base no exemplo da página flock
man:
#!/bin/bash
func() {
echo "$$ trying to acquire lock"
(
flock -e 42
echo "lock acquired by $$"
sleep 10
) 42> /tmp/mylock
echo "lock released by $$"
}
func
Agora, se eu executar esse script uma vez:
$ bash ex.sh
22241 trying to acquire lock
lock acquired by 22241
lock released by 22241
Se eu executar duas instâncias nessa janela de suspensão de 10 segundos desse script, a primeira em segundo plano, uma sequência possível de eventos é:
$ bash ex.sh& bash ex.sh
[1] 24518
24519 trying to acquire lock
24518 trying to acquire lock
lock acquired by 24519
lock released by 24519
lock acquired by 24518
$
lock released by 24518
Neste exemplo, o processo do segundo processo ganhou a corrida e adquiriu o bloqueio primeiro. Em seguida, liberou o bloqueio e permitiu que o primeiro processo (do plano de fundo) fosse adquirido e liberou o bloqueio.
Eu posso melhorar as chances de que o primeiro processo vença a corrida, introduzindo um atraso entre iniciá-los:
$ bash ex.sh& sleep 1; bash ex.sh
[1] 30158
30158 trying to acquire lock
lock acquired by 30158
30179 trying to acquire lock
lock released by 30158
lock acquired by 30179
lock released by 30179