fcntl excluir comportamento

1

Eu tenho um requisito para criar bloqueios via fcntl para fazer um script ser executado apenas uma vez com um determinado argumento. Para conseguir isso, eu crio um arquivo com o argumento dado e adquiro o bloqueio nele. Eu tenho o código abaixo escrito em python. Para simplificar, codifiquei o nome do arquivo como "mylockfile"

import traceback
from errno import EACCES, EAGAIN
from fcntl import lockf, LOCK_EX, LOCK_NB
from time import sleep

import os

if __name__ == '__main__':
   # Create lock file and write current pid into it
   fd = open("mylockfile", 'w')
   fd.write("%d " %os.getpid())
   try:
        x = lockf(fd, LOCK_EX | LOCK_NB)
        print("Obtained lock")
        # Do useful work
        sleep(10)

    except OSError as e:
        # Terminate in case of error

        if e.errno in (EACCES, EAGAIN):
            print("Script already running")
            print(e.errno)
        # Traceback of OSError
        traceback.print_exc()
        fd.close()
        exit(1)

    # Do other useful work

Agora, o problema é quando ele vai dormir, eu excluo manualmente o mylockfile e inicio outra instância do script. E, eu esperava que ele falhasse adquirindo o bloqueio como o processo anterior ainda tem um descritor de arquivo aberto anexado a ele. Mas, na verdade, adquire o bloqueio, não sei por que isso está acontecendo. E se esse é um comportamento esperado, como podemos ter certeza de que os arquivos de bloqueio estão protegidos contra exclusão?

    
por Deepthi Nidwannaya 02.02.2018 / 10:34

1 resposta

1

Assim que o arquivo de bloqueio é excluído, qualquer relação entre o descritor de arquivo aberto e o nome do arquivo é perdida. Portanto, não há como um novo processo descobrir que ainda existe outro processo em andamento.

Também não há como proteger o arquivo de bloqueio da exclusão além das permissões habituais do unix; dado privilégios suficientes, o arquivo sempre pode ser excluído. O processo pode verificar regularmente se o arquivo de bloqueio ainda existe e reage de acordo (morrer ou recriar o arquivo de bloqueio), mas não há como torná-lo infalível.

    
por 02.02.2018 / 10:46

Tags