O evento IN_CREATE do incron me dará um arquivo em branco?

5

Eu quero monitorar um diretório para novos arquivos, que serão criados por outro processo. Eu pretendo usar incrod para fazer isso.

Não estou interessado em reagir a alterações nos arquivos, pois os arquivos nunca devem ser atualizados. Portanto, o evento IN_CREATE parece a opção sensata de se ouvir. No entanto, não tenho certeza, se eu ouvir esse evento, posso acabar com um arquivo vazio (antes que o outro processo tenha escrito alguma informação)? Devo usar o evento IN_WRITE_CLOSE em seu lugar?

    
por robingrindrod 14.07.2014 / 12:06

2 respostas

5

Você pode observar quais eventos são passados para seu diretório com inotifywait para verificar como se comporta quando o processo está em execução:

$ inotifywait -m . 
Setting up watches.
Watches established.

Por exemplo, depois de executar touch file no mesmo diretório:

$ inotifywait -m .
Setting up watches.
Watches established.
./ CREATE file
./ OPEN file
./ ATTRIB file
./ CLOSE_WRITE,CLOSE file

Como existe um atraso entre a criação e o fechamento do arquivo, você terá um arquivo vazio após o evento CREATE, como você suspeitava. Observe os eventos após a execução:

from time import sleep

with open("somefile", 'w') as somefile:
    sleep(15)
    somefile.write("...")

Portanto, o uso do evento CLOSE_WRITE parece razoável.

    
por 15.07.2014 / 12:28
3

Sim, IN_CREATE irá (ou pelo menos poderá) fornecer um arquivo vazio. Como o nome indica, o evento é gerado quando um novo arquivo é criado e novos arquivos são criados em branco. É possível que, no momento em que o processo que recebe a notificação comece a ler o arquivo, o arquivo não esteja vazio, mas normalmente não será totalmente escrito nesse ponto.

Para reagir a um arquivo concluído, IN_WRITE_CLOSE é o que você precisa. Observe que esse evento será acionado se o processo de criação do arquivo falhar. Para evitar isso, uma estratégia comum é fazer com que o processo grave o arquivo e renomeie-o (possivelmente movendo-o para um diretório diferente). Seu monitor ouviria então IN_MOVED_FROM .

    
por 15.07.2014 / 12:31

Tags