O flock & exec é seguro no bash?

13

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

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

É seguro (o teste parece dizer isso) usar execnesse ponto? O subprocesso reterá a trava?

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

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

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

Danny
fonte

Respostas:

3

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

Gilles 'SO- parar de ser mau'
fonte
6

Sim, ele é. O Exec apenas substitui a imagem do processo, mas ainda é o mesmo processo, para que os bloqueios no nível do SO associados a ela permaneçam os mesmos.

É muito fácil verificar se funciona:

trava

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

roteiro

sleep 100

Tente executar ./lockduas vezes nos próximos 100 segundos. Você só obterá a trava uma vez, execportanto, a liberação não será liberada.

PSkocik
fonte