यह सवाल एक और से उठता है जो मैंने स्टैकओवरफ्लो पर डाला था । मैं वॉचर का उपयोग कर रहा हूं - वही समस्याएं इंक्रॉन पर लागू होती हैं - एक फ़ोल्डर और उसके बच्चे के फ़ोल्डर को परिवर्तनों के लिए मॉनिटर करने के लिए और ड्रॉपबॉक्स में चुपचाप उन परिवर्तनों को दूर करने के लिए गिलहरी।
मैं इस write_closeघटना की निगरानी करता हूं - IN_CLOSE_WRITE- इस उद्देश्य के लिए। मूलतः मैं modifyइवेंट देख रहा था , यानी IN_MODIFY। जबकि यह काम मैंने पाया है कि बड़ी फ़ाइलों को लिखते समय यह एक से अधिक बार आग लगाएगा। यह उचित लग रहा था इसलिए मैंने स्विच किया IN_CLOSE_WRITEक्योंकि मुझे लगा कि यह मान लेना उचित है कि किसी दिए गए फ़ाइल के लिए यह केवल एक बार होगा।
हालांकि, यह मामला नहीं है। यहां तक कि एक बहुत छोटी पाठ फ़ाइल के लिए - सिर्फ एक चरित्र - नैनो में निर्मित घटना दो बार होती है। जब यह एक ही फाइल ड्रॉपबॉक्स पर दो बार सिंक्रनाइज़ हो जाती है, तो सबसे अच्छा परिणाम हो सकता है। अपने स्वयं के मामले में यह आपदा की ओर जाता है क्योंकि पहली घटना पर मैं सिंक्रनाइज़ेशन करता हूं और फिर सर्वर साइड फ़ाइल को हटा देता हूं। परिणाम - दूसरी घटना पर ड्रॉपबॉक्स साइड फ़ाइल 0 बाइट फ़ाइल बन जाती है।
इससे पहले कि मैं कुछ और करने से पहले अपनी सिंक्रोनाइज़ेशन स्क्रिप्ट को 10 के लिए सोते हुए इसके साथ काम कर रहा हूं और फिर मैं जांचता हूं कि ड्रॉपबॉक्स सिंक का प्रयास करने से पहले प्रश्न में फाइल अभी भी मौजूद है। यह काम करता है क्योंकि दूसरी पुनरावृत्ति पर फ़ाइल गायब है और स्क्रिप्ट अभी समाप्त हो गई है।
यह सबसे अच्छा लगता है। शायद एक बुरा हैक नहीं है, लेकिन मैं यह समझना पसंद करूंगा - सिर्फ IN_CLOSE_WRITEएक बार भी घटना क्यों होती है?
कुछ अतिरिक्त जानकारी
- यह सुनिश्चित करने के लिए जांचें कि वॉकर चलाने के कई उदाहरण नहीं हैं।
से आउटपुट 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
फाइल सिस्टम है ext4। मुझे यह उल्लेख करना चाहिए कि मैंने इन्क्रॉन के साथ एक ही मुद्दे का सामना किया है। मैं एक बैच स्क्रिप्ट के माध्यम से निष्पादित वॉचर डेमॉन को शुरू करता हूं /etc/rc2.d। Incron OTH अपने डिफ़ॉल्ट apt-get install incronस्थापना के माध्यम से मेरे बारे में कोई गड़बड़ किए बिना शुरू होता है ।
मेरी watcher.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
मैंने datastore.phpयह सुनिश्चित करने के लिए स्क्रिप्ट को कम कर दिया कि यह बिना किसी गन्दे ड्रॉपबॉक्स अपलोड + सोर्स डिलीट कोड के दो बार निकाल दिया गया है।
#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);
?>
मैंने फिर प्रश्न में पथ पर एक छोटी फ़ाइल बनाई और फिर जांच की /tmp/watcher। समस्या अभी भी बनी हुई है - फ़ाइल में अभी भी दो के लिए लगातार प्रविष्टियाँ हैं $argv[1]।
ext4और मुझे पूरा यकीन है कि मेरे पास वॉकर चलाने के दो उदाहरण नहीं हैं। मैं इन्क्रॉन के साथ एक ही मुद्दे पर चला हूं।
deleteदिनचर्या को अक्षम कर सकते हैं और फिर से प्रयास कर सकते हैं ?
unlinkआईएनजी समस्या बनी नहीं है