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 #