Cette question découle d'une autre que j'avais posée sur Stackoverflow . J'utilise Watcher - les mêmes problèmes s'appliquent à Incron - pour surveiller un dossier et ses dossiers enfants pour les modifications et écarter silencieusement ces modifications vers Dropbox.
Je surveille l' write_close
événement - IN_CLOSE_WRITE
- dans ce but. À l'origine, je regardais l' modify
événement, c'est-à-dire IN_MODIFY. Bien que cela ait fonctionné, j'ai constaté que lors de l'écriture de gros fichiers, il se déclencherait plus d'une fois. Cela semblait juste, alors je suis passé à IN_CLOSE_WRITE
car je pensais qu'il était raisonnablement juste de supposer que pour un fichier donné, cela ne se produirait qu'une seule fois.
Cependant, ce n'est pas le cas. Même pour un très petit fichier texte - un seul caractère - créé dans Nano, l'événement se produit deux fois. Au mieux, cela peut entraîner un trafic inutile lorsque le même fichier est synchronisé deux fois sur Dropbox. Dans mon propre cas, cela conduit à un désastre car lors du premier événement, j'effectue la synchronisation, puis je supprime le fichier côté serveur. Le résultat - lors du deuxième événement, le fichier latéral Dropbox devient un fichier de 0 octet.
Je traite cela pour l'instant en faisant dormir mon script de synchronisation pendant 10 secondes avant de faire quoi que ce soit d'autre, puis je vérifie que le fichier en question existe toujours avant d'essayer la synchronisation Dropbox. Cela fonctionne car à la deuxième itération, le fichier est manquant et le script se termine juste.
Cela semble au mieux hackish. Peut-être pas un mauvais hack mais je préférerais comprendre - pourquoi même l' IN_CLOSE_WRITE
événement se produit-il plus d'une fois?
Quelques informations supplémentaires
- Vérifiez qu'il n'y a pas plusieurs instances de watcher en cours d'exécution.
Sortie 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
Le système de fichiers est ext4
. Je dois mentionner que j'ai rencontré exactement le même problème avec Incron. Je démarre le démon Watcher à partir d'un script batch exécuté via /etc/rc2.d
. Incron OTH démarre sans aucun problème de ma part via son apt-get install incron
installation par défaut .
L'essence de mon watcher.ini
dossier est illustrée ci-dessous.
[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
J'ai réduit le datastore.php
script à l'essentiel pour vérifier qu'il est déclenché deux fois sans aucun de mon code de téléchargement + suppression de source Dropbox désordonné.
#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);
?>
J'ai ensuite créé un petit fichier sur le chemin en question puis examiné /tmp/watcher
. Le problème persiste - le fichier contient toujours deux entrées successives pour $argv[1]
.
ext4
et je suis raisonnablement sûr de ne pas avoir deux instances de Watcher en cours d'exécution. J'ai rencontré le même problème avec Incron.
delete
routine et réessayer?
unlink
problème, le problème persiste