Mengapa melakukan inotify memecat lebih dari satu kali

13

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_closeacara - IN_CLOSE_WRITE- untuk tujuan itu. Awalnya saya menonton modifyacara 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_WRITEkarena 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_WRITEacara 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 incroninstalasi default-nya .


Inti dari watcher.inifile 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.phpskrip 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].

DroidOS
sumber
1
Saya telah mencoba banyak variasi, tetapi saya tidak dapat menduplikasi masalah Anda dengan beberapa pemecatan IN_CLOSE_WRITE. Apa pun yang saya lakukan menyebabkan satu output tidak masuk akal. Saya akan terus mencoba berbagai hal. Namun sejauh ini, hanya pertanyaan. Sistem file yang mana? Ext4? Lain?
lornix
@lornix - silakan lihat suntingan untuk pertanyaan saya. Sistem file ext4dan saya cukup yakin saya tidak memiliki dua contoh Watcher berjalan. Saya telah mengalami masalah yang sama dengan Incron.
DroidOS
Anda berkata 'Saya melakukan sinkronisasi dan kemudian menghapus file sisi server'. Apakah penghapusan ini memicu acara kedua? Bisakah Anda menonaktifkan deleterutin dan coba lagi?
Germar
@ Germar - lihat hasil edit pertanyaan saya. Bahkan dengan skrip sinkronisasi tidak melakukan sinkronisasi nyata dan tidak ada unlinkmasalah tetap ada
DroidOS
Maaf, karena kehabisan ide, saya tidak dapat mereproduksi masalah pada mesin saya. Saya mendapatkan satu acara, tidak ada lagi. Sesuatu yang lain terlibat, sesuatu yang tidak disebutkan. Apakah Anda sudah menginstal antivirus? sesuatu seperti itu?
lornix

Jawaban:

1

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

Edik Mkoyan
sumber
Anda mungkin telah meletakkan jari Anda pada sesuatu yang cukup valid di sini. Ini akan membutuhkan penyelidikan. Terima kasih atas tipnya. Saya akan memposting kembali jika saya menemukan bahwa ini adalah masalah.
DroidOS
Saya tidak berpikir bahwa ATTRIB menambahkan sesuatu ke file itu sendiri, saya salah.
Edik Mkoyan
0

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 inotifywaitmemecat 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?

neocpp
sumber
terima kasih atas saran anda. Aku telah lari ke inotify masalah beberapa bahkan ketika saya membuat sangat sepele berkas 1 byte dengan Nano - atau bahkan dengan hanya mengarahkan satu char dari konsol ke dalam sebuah file. "Solusi" yang telah saya uraikan dalam pertanyaan awal saya adalah membuat saya terus maju untuk saat ini. Namun, dalam jangka panjang satu-satunya solusi saya harus membangun kembali server saya mulai dari awal untuk mengidentifikasi tepat ketika kesalahan dimulai - setup saya dengan Incron, Watcher (btw itu terjadi ketika saya baru saja Incron), MariaDB, Nginx, Redis, Memcached ... bukan yang "sederhana".
DroidOS
Untuk jaga-jaga, periksa kembali apakah Anda tidak memonitor folder yang sama dua kali. Jika tidak, maka misalnya ketika saya menyalin file ke share samba melalui os x samba client, ini terjadi create, close_write, delete, create, close_write Ketika saya melakukan itu dengan klien windows, sepertinya lebih masuk akal buat, write_close dan tidak lebih. Jadi saya memecahkan masalah saya dengan memonitor modifikasi file pertama dengan direktori IN_MODIFY, IN_ONESHOT / ini. perintah sleep someTime oneshot melakukan hal itu.
Edik Mkoyan