O flock & exec é seguro no bash?

13

O snippet de bloqueio "padrão" que vi é algo como ...

(
    flock -n 200 || exit 1;
    # do stuff
) 200>program.lock

É seguro (o teste parece dizer isso) usar exec nesse ponto? O subprocesso manterá o bloqueio?

(
    flock -n 200 || exit 1;
    exec /usr/bin/python vendors-notcoolstuff.py
) 200>program.lock

Lembro vagamente que processos executados mantêm descritores de arquivos abertos e, como o flock usa descritores de arquivos, ele deve funcionar. Mas não consigo encontrar nenhuma documentação que torne isso definitivo e claro.

Para o registro, isso é específico para o Linux.

    
por Danny 15.05.2015 / 22:48

2 respostas

3

Sim, os bloqueios são preservados em exec . Os bloqueios são preservados na chamada de sistema subjacente execve , desde que o descritor de arquivo permaneça aberto. Os descritores de arquivos permanecem abertos em execve , a menos que tenham sido configurados para serem fechados em exec e os descritores de arquivos criados por redirecionamento de shell não sejam marcados como close-on-exec.

    
por 16.05.2015 / 02:18
6

Sim, é. O Exec apenas substitui a imagem do processo, mas ainda é o mesmo processo, portanto, os bloqueios no nível do SO associados a ele permanecem os mesmos.

É muito fácil verificar se funciona:

bloqueio

(
    flock -n 200 || exit 1;
    echo "locked"
    exec ./script
) 200>program.lock

script

sleep 100

Tente executar ./lock duas vezes nos próximos 100 segundos. Você só receberá o bloqueio uma vez, ergo exec não libera o bloqueio.

    
por 16.05.2015 / 01:31

Tags