Não é possível obter o bash flock para trabalhar

1

Eu deduzi um script bash de amostra do que eu vi por aí, em relação à função bash flock . Eu faço:

func()
{
    42>/home/foo
    flock -e 42 || exit 1
    echo "hello world"
    sleep 5
}

Em seguida, executo consecutivamente func& , cada qual imprime hello world imediatamente, enquanto espero que o primeiro imprima a mensagem e o restante saia. O que estou perdendo aqui?

    
por corsel 13.03.2018 / 15:17

1 resposta

2

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
    
por 13.03.2018 / 15:47