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 adaJawaban:
Saya tidak yakin, tetapi kemungkinan besar write_close pertama menulis atribut file ke dalamnya, seperti waktu pembuatan, dan hanya setelah itu ia menulis data aktual. Bahkan rsync membuat file temp dan ketika semuanya selesai memindahkan file temp ke file yang sebenarnya di folder yang sama sehingga mudah untuk memantau telah dibuat secara normal ketika Anda menggunakan rsync, dan bergerak adalah operasi atom. Di sisi lain ada sesuatu yang tidak diinginkan dalam satu suntikan, mungkin menggunakan itu kita dapat memicu sesuatu pada pesan modifikasi pertama, dan seperti yang Anda sarankan tidur untuk jumlah waktu yang wajar sebelum memulai operasi. Saya sedang menggali ini sekarang, dan akan memperbarui ketika saya menemukan sesuatu yang baru. /superuser/1133642/traceing-the-moment-when-file-is-completely-copied-to-samba-share-with-inotify
sumber
Saya tidak memiliki cukup perwakilan untuk memposting ini sebagai komentar, tetapi apakah Anda yakin file sementara yang mungkin disembunyikan tidak dibuat? Saya memiliki masalah yang sama dengan
inotifywait
memecat beberapa kali, tetapi saya menyadari itu karena vim akan membuat file .swp saat mengedit, yang akan memecat suatu peristiwa saat menutup. Itu juga akan mengambil acara tutup dari file asli.Kedengarannya seperti Anda memperhatikan peristiwa menembakkan beberapa file pada file yang sama, yang bukan sesuatu yang saya dapat mereproduksi - ini hanya akan terjadi sekali untuk file temp dan sekali untuk yang asli.
Saya mencoba tes cepat dengan nano dan saya tidak berpikir itu membuat file temp sama sekali (setidaknya untuk beberapa kasus karakter), tetapi apakah ada hal lain dalam pengaturan Anda yang dapat mengandalkan perilaku serupa?
sumber