Esta pregunta surge de otra que había planteado en Stackoverflow . Estoy usando Watcher , los mismos problemas se aplican a Incron , para monitorear una carpeta y sus carpetas secundarias en busca de cambios y silenciar esos cambios en Dropbox.
Superviso el write_close
evento - IN_CLOSE_WRITE
- con el propósito. Originalmente estaba viendo el modify
evento, es decir, IN_MODIFY. Si bien esto funcionó, descubrí que al escribir archivos grandes se dispararía más de una vez. Eso sonaba justo, así que cambié IN_CLOSE_WRITE
ya que sentí que era razonablemente justo suponer que para un archivo dado solo ocurriría una vez.
Sin embargo, este no es el caso. Incluso para un archivo de texto muy pequeño, solo un carácter, creado en Nano, el evento ocurre dos veces. En el mejor de los casos, esto puede generar tráfico innecesario cuando el mismo archivo se sincroniza en Dropbox dos veces. En mi propio caso conduce a un desastre ya que en el primer evento realizo la sincronización y luego elimino el archivo del lado del servidor. El resultado: en el segundo evento, el archivo lateral de Dropbox se convierte en un archivo de 0 bytes.
Estoy lidiando con esto por ahora haciendo que mi script de sincronización duerma por 10 segundos antes de hacer cualquier otra cosa y luego verifico que el archivo en cuestión aún exista antes de intentar la sincronización de Dropbox. Esto funciona porque en la segunda iteración falta el archivo y el script simplemente termina.
Esto suena hackear en el mejor de los casos. Quizás no sea un mal truco, pero preferiría entenderlo, ¿por qué incluso el IN_CLOSE_WRITE
evento ocurre más de una vez?
Alguna información adicional
- Verifique para asegurarse de que no haya varias instancias de observador en ejecución.
Salida 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
El sistema de archivos es ext4
. Debo mencionar que he encontrado exactamente el mismo problema con Incron. Comienzo el demonio Watcher desde un script por lotes ejecutado a través de /etc/rc2.d
. Incron OTH se inicia sin ningún problema por mí a través de su apt-get install incron
instalación predeterminada .
La esencia de mi watcher.ini
archivo se muestra a continuación.
[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
Reduje la datastore.php
secuencia de comandos a lo esencial para verificar que se activa dos veces sin ninguno de mis desordenados carga de Dropbox + código de eliminación de fuente.
#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);
?>
Luego creé un pequeño archivo en la ruta en cuestión y luego lo examiné /tmp/watcher
. El problema aún persiste: el archivo todavía tiene dos entradas sucesivas para $argv[1]
.
ext4
y estoy razonablemente seguro de que no tengo dos instancias de Watcher ejecutándose. Me he encontrado con el mismo problema con Incron.
delete
rutina e intentarlo de nuevo?
unlink
problemas, el problema persiste