Pertanyaan ini muncul dari pertanyaan lain yang saya ajukan di Stackoverflow . Saya menggunakan Watcher - masalah yang sama berlaku untuk Incron - untuk memantau folder dan folder turunannya untuk perubahan dan diam-diam membuang perubahan itu ke Dropbox.
Saya memantau write_close
acara - IN_CLOSE_WRITE
- untuk tujuan itu. Awalnya saya menonton modify
acara tersebut, yaitu IN_MODIFY. Sementara ini berhasil saya menemukan bahwa ketika menulis file besar itu akan menyala lebih dari sekali. Kedengarannya adil, jadi saya beralih ke IN_CLOSE_WRITE
karena saya merasa wajar untuk menganggap bahwa untuk file yang diberikan itu hanya akan terjadi sekali.
Namun, bukan itu masalahnya. Bahkan untuk file teks yang sangat kecil - hanya satu karakter - dibuat di Nano acara tersebut terjadi dua kali. Paling-paling ini dapat menghasilkan lalu lintas yang tidak perlu ketika file yang sama disinkronkan di Dropbox dua kali. Dalam kasus saya sendiri itu menyebabkan bencana karena pada acara pertama saya melakukan sinkronisasi dan kemudian menghapus file sisi server. Hasilnya - pada acara kedua file sisi Dropbox menjadi file 0 byte.
Saya berurusan dengan ini untuk saat ini dengan membuat skrip sinkronisasi saya tidur selama 10 detik sebelum saya melakukan hal lain dan kemudian saya memeriksa apakah file tersebut masih ada sebelum mencoba sinkronisasi Dropbox. Ini berfungsi karena pada iterasi kedua file hilang dan skrip berakhir begitu saja.
Ini kedengarannya terbaik sekali. Mungkin bukan peretasan yang buruk tapi saya lebih suka untuk mengerti - hanya mengapa IN_CLOSE_WRITE
acara itu terjadi lebih dari satu kali?
Beberapa informasi tambahan
- Periksa untuk memastikan bahwa tidak ada beberapa kejadian pengamat berjalan.
Output dari 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
Sistem file adalah ext4
. Saya harus menyebutkan bahwa saya telah mengalami masalah yang sama persis dengan Incron. Saya memulai daemon Watcher dari skrip batch yang dieksekusi melalui /etc/rc2.d
. Incron OTH mulai tanpa saya main-main melalui apt-get install incron
instalasi default-nya .
Inti dari watcher.ini
file saya ditunjukkan di bawah ini.
[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
Saya mengurangi datastore.php
skrip ke esensi telanjang untuk memverifikasi bahwa skrip dinyalakan dua kali tanpa ada salah satu kode saya yang meng-upload + sumber Dropbox.
#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);
?>
Saya kemudian membuat file kecil di jalur yang dimaksud dan kemudian memeriksa /tmp/watcher
. Masalahnya masih berlanjut - file masih memiliki dua entri berturut-turut untuk $argv[1]
.
ext4
dan saya cukup yakin saya tidak memiliki dua contoh Watcher berjalan. Saya telah mengalami masalah yang sama dengan Incron.
delete
rutin dan coba lagi?
unlink
masalah tetap ada