Essa pergunta surge de outra que eu havia colocado no Stackoverflow . Estou usando o Watcher - os mesmos problemas se aplicam ao Incron - para monitorar uma pasta e suas pastas filho em busca de alterações e, silenciosamente, esquecer essas alterações no Dropbox.
Monitoro o write_close
evento - IN_CLOSE_WRITE
- para o efeito. Originalmente, eu estava assistindo o modify
evento, ou seja, IN_MODIFY. Enquanto isso funcionava, descobri que ao escrever arquivos grandes, ele disparava mais de uma vez. Parecia justo, então mudei para, IN_CLOSE_WRITE
pois achava razoavelmente justo supor que, para um determinado arquivo, isso ocorreria apenas uma vez.
No entanto, esse não é o caso. Mesmo para um arquivo de texto muito pequeno - apenas um caractere - criado no Nano, o evento ocorre duas vezes. Na melhor das hipóteses, isso pode resultar em tráfego desnecessário quando o mesmo arquivo é sincronizado no Dropbox duas vezes. No meu caso, isso leva a um desastre, já que no primeiro evento eu executo a sincronização e excluo o arquivo do lado do servidor. O resultado - no segundo evento, o arquivo do lado do Dropbox se torna um arquivo de 0 byte.
Por enquanto, estou lidando com isso, deixando meu script de sincronização por 10s antes de fazer qualquer outra coisa e depois verifico se o arquivo em questão ainda existe antes de tentar a sincronização do Dropbox. Isso funciona porque na segunda iteração o arquivo está ausente e o script é finalizado.
Isso parece insensato, no melhor dos casos. Talvez não seja um truque ruim, mas eu prefiro entender - apenas por que o IN_CLOSE_WRITE
evento ocorre mais de uma vez?
Algumas informações adicionais
- Verifique para garantir que não haja várias instâncias do observador em execução.
Saída de ps ax|grep watcher.py
23880 ? Sl 0:01 python /usr/local/bin/watcher.py restart
24977 pts/0 S+ 0:00 grep --color=auto watcher.py
O sistema de arquivos é ext4
. Devo mencionar que encontrei exatamente o mesmo problema com o Incron. Inicio o daemon Watcher a partir de um script em lote executado via /etc/rc2.d
. O Incron OTH é iniciado sem nenhuma confusão por mim através de sua apt-get install incron
instalação padrão .
A essência do meu watcher.ini
arquivo é mostrada abaixo.
[DEFAULT]
logfile=/var/log/watcher.log
pidfile=/var/run/watcher.pid
[job1]
watch=/path/to/watch
events=write_close
excluded=
recursive=true
autoadd=true
command=/home/datastore.php $filename
Reduzi o datastore.php
script ao essencial para verificar se ele foi acionado duas vezes sem nenhum dos meus bagunçados códigos do Dropbox upload + source delete.
#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);
?>
Criei um pequeno arquivo no caminho em questão e depois examinei /tmp/watcher
. O problema ainda persiste - o arquivo ainda possui duas entradas sucessivas para $argv[1]
.
ext4
e tenho certeza de que não tenho duas instâncias do Watcher em execução. Corri para o mesmo problema com o Incron.delete
rotina e tentar novamente?unlink
persistir o problema #Respostas:
Não tenho certeza, mas provavelmente o primeiro write_close grava atributos de arquivo nele, como o tempo de criação, e somente depois disso grava dados reais. De fato, o rsync cria um arquivo temporário e, quando tudo é feito, move o arquivo temporário para o arquivo real na mesma pasta, para que seja fácil monitorar o processo normalmente criado quando você usa o rsync, e move é uma operação atômica. Por outro lado, há algo que apenas uma tentativa de inotify, provavelmente, usando isso, podemos disparar algo na primeira mensagem de modificação e, como você sugeriu dormir por um período razoável antes de iniciar a operação. Estou cavando isso agora e será atualizado quando encontrar algo novo. /superuser/1133642/traceing-the-moment-when-file-is-completely-copied-to-samba-share-with-inotify
fonte
Não tenho representante suficiente para postar isso como um comentário, mas você tem certeza de que arquivos temporários, possivelmente ocultos, não estão sendo criados? Eu tive um problema semelhante ao
inotifywait
disparar várias vezes, mas percebi que era porque o vim criaria um arquivo .swp ao editar, o que dispararia um evento ao fechar. Ele também pegaria o evento close do arquivo original.Parece que você está percebendo o evento disparando vários arquivos no mesmo arquivo, o que não é algo que eu possa reproduzir - isso aconteceria apenas uma vez no arquivo temporário e no original.
Eu tentei um teste rápido com o nano e não acho que ele crie um arquivo temporário (pelo menos para os poucos caracteres), mas há mais alguma coisa na sua configuração que possa depender de um comportamento semelhante?
fonte