Esta questão surge de outra que eu coloquei em Stackoverflow . Estou usando o Watcher - os mesmos problemas se aplicam a Incron - para monitorar uma pasta e suas pastas filhas quanto a mudanças e silenciosamente esquecê-las do Dropbox.
Eu monitore o evento write_close
- IN_CLOSE_WRITE
- para o propósito. Originalmente, eu assisti ao evento modify
, ou seja, IN_MODIFY. Enquanto isso funcionou, descobri que ao escrever arquivos grandes, ele dispararia mais de uma vez. Isso soou justo, então mudei para IN_CLOSE_WRITE
, pois achei que seria razoavelmente justo supor que, para um determinado arquivo, isso só ocorreria 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 ao desastre, pois no primeiro evento eu faço a sincronização e, em seguida, excluo o arquivo do lado do servidor. O resultado - no segundo evento, o arquivo secundário do Dropbox se torna um arquivo de 0 bytes.
Estou lidando com isso por enquanto, fazendo meu script de sincronização dormir por 10s
antes de fazer qualquer outra coisa e depois verificar que 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á faltando e o script termina.
Isso soa hackeado na melhor das hipóteses. Talvez não seja um hack ruim, mas eu prefiro entender - por que mesmo o evento IN_CLOSE_WRITE
ocorre mais de uma vez?
Algumas informações adicionais
- Verifique se não há 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
. Eu devo mencionar que eu encontrei precisamente o mesmo problema com o Incron. Eu inicio o daemon do Watcher a partir de um script em lote executado via /etc/rc2.d
. O Incron OTH inicializa sem qualquer problema comigo por meio de sua instalação apt-get install incron
padrão.
A essência do meu arquivo watcher.ini
é 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 script datastore.php
para o essencial para verificar se ele é disparado duas vezes sem nenhum dos meus bagunçados uploads do Dropbox + código de exclusão da fonte.
#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);
?>
Eu, então, criei um pequeno arquivo no caminho em questão e, em seguida, examinei /tmp/watcher
. O problema ainda persiste - o arquivo ainda tem duas entradas sucessivas para $argv[1]
.