क्यों घटनाओं को एक से अधिक बार आग लगाते हैं


13

यह सवाल एक और से उठता है जो मैंने स्टैकओवरफ्लो पर डाला था । मैं वॉचर का उपयोग कर रहा हूं - वही समस्याएं इंक्रॉन पर लागू होती हैं - एक फ़ोल्डर और उसके बच्चे के फ़ोल्डर को परिवर्तनों के लिए मॉनिटर करने के लिए और ड्रॉपबॉक्स में चुपचाप उन परिवर्तनों को दूर करने के लिए गिलहरी।

मैं इस 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]


1
मैंने कई बदलावों की कोशिश की है, लेकिन कई IN_CLOSE_WRITE फ़ेरिंग्स के साथ आपके मुद्दे की नकल करने में असमर्थ हूं। मैंने जो कुछ भी किया है वह एकल इनोटिफाई आउटपुट का कारण बनता है। मैं कोशिश कर रहा हूँ चीजों को रखने के लिए। लेकिन अभी तक, केवल सवाल। कौन सा फाइल सिस्टम? Ext4? अन्य?
लोर्निक्स

@lornix - कृपया मेरे प्रश्न का संपादन देखें। फ़ाइल सिस्टम है ext4और मुझे पूरा यकीन है कि मेरे पास वॉकर चलाने के दो उदाहरण नहीं हैं। मैं इन्क्रॉन के साथ एक ही मुद्दे पर चला हूं।
DroidOS

आपने कहा था 'मैं सिंक्रोनाइज़ेशन करता हूं और फिर सर्वर साइड फाइल को डिलीट करता हूं।' क्या यह डिलीट दूसरी घटना को ट्रिगर करता है? क्या आप deleteदिनचर्या को अक्षम कर सकते हैं और फिर से प्रयास कर सकते हैं ?
जर्मनर

@Germar - मेरे प्रश्न का संपादन देखें। यहां तक ​​कि सिंक स्क्रिप्ट के साथ कोई वास्तविक सिंकिंग और कोई unlinkआईएनजी समस्या बनी नहीं है
DroidOS

क्षमा करें, विचारों के बजाय, मैं अपनी किसी भी मशीन पर समस्या को पुन: उत्पन्न नहीं कर सकता। मुझे एक घटना मिलती है, और नहीं। कुछ और शामिल है, कुछ उल्लेख नहीं है। क्या आपके पास एंटीवायरस स्थापित है? इसके समान कुछ भी?
लोर्निक्स

जवाबों:


1

मुझे यकीन नहीं है, लेकिन संभवत: पहला राइट_क्लोज़ इसमें फ़ाइल विशेषताओं को लिखता है, जैसे सृजन समय, और उसके बाद ही यह वास्तविक डेटा लिखता है। वास्तव में rsync एक अस्थायी फ़ाइल बनाता है और जब सब कुछ हो जाता है तो यह उसी फ़ाइल में अस्थायी फ़ाइल को वास्तविक फ़ाइल में ले जाता है, इसलिए मॉनिटर करना आसान होता है जब आप rsync का उपयोग करते हैं, तो यह सामान्य रूप से बनाया जाता है, और चाल एक परमाणु ऑपरेशन होता है। दूसरी ओर, इनओटिफ़ में एक शॉट केल कुछ होता है, शायद इसका उपयोग करते हुए हम पहले संशोधित संदेश पर कुछ ट्रिगर कर सकते हैं, और जैसा कि आपने ऑपरेशन शुरू करने से पहले उचित समय के लिए नींद का सुझाव दिया था। मैं अब इसे खोद रहा हूं, और जब मुझे कुछ नया मिलेगा तो मैं इसे अपडेट करूंगा। /superuser/1133642/traceing-the-moment-when-file-is-completely-copied-to-samba-share-with-inotify


आप अच्छी तरह से यहाँ कुछ मान्य पर अपनी उंगली रख सकते हैं। इसके लिए कुछ जांच की आवश्यकता होगी। पारितोषिक के लिए धन्यवाद। मैं इस घटना में वापस आऊंगा कि मुझे लगता है कि यह किसी भी तरह से एक मुद्दा है।
DroidOS

मुझे नहीं लगता कि ATTRIB फाइल में कुछ भी जोड़ता है, मैं गलत था।
एडिक मकोयान

0

मेरे पास इसे टिप्पणी के रूप में पोस्ट करने के लिए पर्याप्त प्रतिनिधि नहीं है, लेकिन क्या आप सुनिश्चित हैं कि अस्थायी, संभवतः-छिपी हुई फाइलें नहीं बनाई जा रही हैं? मेरे पास inotifywaitकई बार फायरिंग के साथ एक समान मुद्दा था , लेकिन मुझे एहसास हुआ कि संपादन करते समय विम एक .swp फ़ाइल बनाएगा, जो बंद होने पर एक घटना को आग लगा देगा। यह मूल फ़ाइल से नज़दीकी घटना को भी उठाएगा।

ऐसा लगता है कि आप एक ही फ़ाइल पर कई फ़ाइलों को फायर करने की घटना को नोटिस कर रहे हैं, जो कि कुछ ऐसा नहीं है जिसे मैं पुन: पेश करने में सक्षम हूं - यह केवल एक बार अस्थायी फ़ाइल के लिए और एक बार मूल के लिए होगा।

मैंने नैनो के साथ एक त्वरित परीक्षण की कोशिश की और मुझे नहीं लगता कि यह बिल्कुल (कुछ चरित्र मामले के लिए) कम से कम एक अस्थायी फ़ाइल बनाता है, लेकिन क्या आपके सेटअप में कुछ और है जो समान व्यवहार पर भरोसा कर सकता है?


आपके सुझावों के लिए धन्यवाद। जब मैं नैनो के साथ एक बहुत ही तुच्छ 1 बाइट फ़ाइल बनाता हूं, या यहां तक ​​कि कंसोल में से एक एकल चर को पुनर्निर्देशित करके भी एक फ़ाइल में एकाधिक समस्या को हल करता हूं। "मूल समाधान" जो मैंने अपने मूल प्रश्न में उल्लिखित किया है, वह मुझे अभी के लिए बना रहा है। हालाँकि, दीर्घावधि में एकमात्र समाधान मुझे अपने सर्वर को फिर से शुरू करना है, जिससे स्क्रैच से शुरू होने वाली पहचान तब होती है जब त्रुटि शुरू होती है - मेरा सेटअप इनक्रॉन के साथ, वॉकर (btw यह तब हुआ जब मेरे पास सिर्फ Incron था), MariaDB, Nginx, Redis, Memcached ... बिल्कुल "सरल" नहीं है।
DroidOS

यदि आप एक ही फ़ोल्डर की दो बार निगरानी नहीं कर रहे हैं, तो बस मामले में, दोहरी जांच करें। यदि नहीं, तो उदाहरण के लिए जब मैं ओएस एक्स सांबा क्लाइंट के माध्यम से सांबा शेयर पर फाइल कॉपी करता हूं, तो यह होता है कि, create_write, delete, create, close_write जब मैं ऐसा करता हूं, तो विंडोज़ क्लाइंट के साथ, यह अधिक उचित बनाएँ, राइट_क्लोज़ और कुछ भी नहीं दिखता है। इसलिए मैं इस IN_MODIFY, IN_ONESHOT / निर्देशिका के साथ फ़ाइल के पहले संशोधन की निगरानी करके अपनी समस्या हल करता हूं। नींद के कुछ आदेश oneshot बात करता है।
एडिक मकोयान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.