मैं कैसे जांच सकता हूं कि फ़ाइल अभी भी लिखी जा रही है या नहीं? मुझे किसी अन्य प्रक्रिया द्वारा फ़ाइल को बनाने, लिखने और बंद करने की प्रतीक्षा करने की आवश्यकता है, इसलिए मैं अपनी प्रक्रिया में इसे फिर से खोल सकता हूं।कैसे जांचें कि कोई फ़ाइल अभी भी लिखी जा रही है या नहीं?
उत्तर
सामान्य रूप से, यह हल करने में एक कठिन समस्या है। आप पूछ सकते हैं कि कुछ परिस्थितियों में फ़ाइल खुली है; हालांकि, अगर दूसरी प्रक्रिया एक स्क्रिप्ट है, तो यह फ़ाइल को कई बार खोल और बंद कर सकती है। मैं दृढ़ता से अनुशंसा करता हूं कि आप किसी सलाहकार लॉक का उपयोग करें, या फ़ाइल के साथ किए जाने पर संवाद करने के लिए दूसरी प्रक्रिया के लिए कुछ अन्य स्पष्ट विधि का उपयोग करें।
उसने कहा, अगर यह कोई विकल्प नहीं है, तो दूसरा तरीका है। यदि आप /proc/<pid>/fd
निर्देशिकाओं में देखते हैं, जहां <pid>
कुछ चल रही प्रक्रिया की संख्यात्मक प्रक्रिया आईडी है, तो आप प्रक्रियाओं को खोलने वाली फ़ाइलों के लिए सिम्लिंक का एक गुच्छा देखेंगे। सिम्लिंक पर अनुमतियाँ उस मोड को प्रतिबिंबित करती हैं जिसकी फ़ाइल को खोला गया था - लिखने की अनुमति का अर्थ है कि इसे लिखने के तरीके के लिए खोला गया था।
तो, यदि आप जानना चाहते हैं कि कोई फ़ाइल खुलती है, तो बस अपनी प्रक्रिया में प्रत्येक प्रक्रिया के /proc
एंट्री और प्रत्येक फ़ाइल डिस्क्रिप्टर को स्कैन करें, अपनी फ़ाइल में लिखने योग्य सिम्लिंक की तलाश करें। यदि आप अन्य प्रक्रिया के पीआईडी को जानते हैं, तो आप सीधे अपनी proc प्रविष्टि को भी देख सकते हैं।
इसमें कुछ प्रमुख डाउनसाइड्स हैं। सबसे पहले, आप केवल अपनी प्रक्रियाओं के लिए खुली फाइलें देख सकते हैं, जब तक आप रूट न हों। यह अपेक्षाकृत धीमी है, और केवल लिनक्स पर ही काम करता है। और फिर, यदि दूसरी प्रक्रिया फ़ाइल को कई बार खुलती है और बंद कर देती है, तो आप अटक जाते हैं - आप बंद अवधि के दौरान इसे देख सकते हैं, और यह जानने का कोई आसान तरीका नहीं है कि यह फिर से खुल जाएगा या नहीं।
और यदि कुछ रिमोट प्रोसेस एनएफएस के माध्यम से फाइल लिख रहा है, तो आप इसे नहीं देख पाएंगे। (जब तक कोई स्थानीय प्रक्रिया नहीं होती है जो वास्तविक लेखन करता है, लेकिन मुझे लगता है कि यह कर्नेल में किया गया है।) –
आप लिखने की प्रक्रिया को एक सेंटीनेल फ़ाइल लिख सकते हैं ("sentinel.ok" कहें), यह पढ़ने के बाद आपकी रीडिंग प्रक्रिया में रुचि रखने वाली डेटा फ़ाइल लिखना समाप्त हो गया है। पढ़ने की प्रक्रिया में आप सेंटीनेल के अस्तित्व की जांच कर सकते हैं डेटा फ़ाइल पढ़ने से पहले, यह सुनिश्चित करने के लिए कि डेटा फ़ाइल पूरी तरह लिखी गई है।
@ blu3bird का एक सेंटीनेल फ़ाइल का उपयोग करने का विचार बुरा नहीं है, लेकिन इसे फ़ाइल लिखने वाले प्रोग्राम को संशोधित करने की आवश्यकता है।
यहाँ एक और संभावना भी लेखक को संशोधित करने की आवश्यकता है कि है, लेकिन यह और अधिक मजबूत हो सकता है:
एक अस्थायी फ़ाइल के लिए लिखें, कहते हैं कि "foo.dat.part"। जब लेखन पूर्ण हो जाता है, "foo.dat.part" से "foo.dat" का नाम बदलें। इस तरह एक पाठक या तो "foo.dat" को बिल्कुल नहीं देख पाएगा, या इसका पूरा संस्करण देखेंगे।
आप आप जानते हैं कि फ़ाइल, एक बार खोला जाएगा लिखा और उसके बाद बंद कर दिया है inotify
http://en.wikipedia.org/wiki/Inotify
का उपयोग कर की कोशिश कर सकते, यह संभव अपने अनुप्रयोग IN_CLOSE_WRITE
घटना के लिए प्रतीक्षा करने के लिए किया जाएगा।
हालांकि अगर फ़ाइल के लेखन को करने वाले दूसरे एप्लिकेशन का व्यवहार खुले, लिखने, बंद, खुले, लिखने, बंद करने जैसा अधिक है .... तो आपको यह निर्धारित करने के कुछ अन्य तंत्र की आवश्यकता होगी जब अन्य ऐप वास्तव में फाइल के साथ समाप्त हो गया है।
- 1. जांचें कि कोई php स्क्रिप्ट अभी भी चल रही है
- 2. जांचें कि क्या कोई निश्चित कुंजी दबाई जा रही है?
- 3. यह बताने का कोई आसान तरीका है कि क्या mongodb अनुक्रमणिका अभी भी उपयोग की जा रही है या नहीं?
- 4. जांचें कि फ़ाइल मौजूद है या नहीं,
- 5. यह कैसे जांचें कि कोई सूचक मान्य है या नहीं?
- 6. पर्ल कैसे जांचें कि सरणी अभी भी खाली है या नहीं?
- 7. कैसे जांचें कि स्टडीन अभी भी अवरुद्ध किए बिना खोला गया है या नहीं?
- 8. कैसे जांचें कि एक Django उपयोगकर्ता अभी भी क्लाइंट पक्ष से लॉग इन है या नहीं?
- 9. कैसे जांचें कि गतिविधि अभी भी ढेर में है या नहीं?
- 10. कैसे जांचें कि कोई ऑब्जेक्ट कल बराबर है या नहीं?
- 11. कैसे जांचें कि फ़ाइल gzip संपीड़ित है या नहीं?
- 12. कैसे जांचें कि कोई std :: स्ट्रिंग सेट है या नहीं?
- 13. जांच रहा है कि प्रक्रिया अभी भी चल रही है या नहीं?
- 14. जांचें कि कोई फ़ाइल वाइल्डकार्ड
- 15. jQuery - पता लगाएं कि माउस अभी भी है या नहीं?
- 16. टेम्पलेट में कई से अधिक आइटम: जांचें कि कोई खाली नहीं है या कोई भी
- 17. जांचें कि कोई कार्रवाई वर्तमान में चल रही है या नहीं?
- 18. कैसे जांचें कि एक चर में संग्रहीत एक दिया गया फ़ाइल डिस्क्रिप्टर अभी भी वैध है या नहीं?
- 19. प्रदर्शन करता है: कोई नहीं अभी भी
- 20. कैसे जांचें कि कोई थ्रेड सो रहा है या नहीं?
- 21. कैसे जांचें कि कोई संपत्ति मौजूद है या नहीं?
- 22. .NET कैसे जांचें कि पथ एक फ़ाइल है या नहीं?
- 23. जांचें कि कोई फ़ाइल Yii
- 24. जांचें कि कोई फ़ाइल वास्तविक है या प्रतीकात्मक लिंक
- 25. जांचें कि कोई फ़ाइल बाइनरी या ASCII Node.js के साथ है या नहीं?
- 26. जांचें कि कोई फ़ाइल खुली है
- 27. जांचें कि सॉकेट कनेक्ट है या नहीं
- 28. एएस 3: जांचें कि कोई शब्दकोश खाली है या नहीं
- 29. जांचें कि प्रक्रिया चल रही है
- 30. कैसे जांचें कि कोई डेटाटेबल शून्य है या कुछ भी नहीं
क्या आप अपने उपयोगकेस को और अधिक अच्छी तरह समझा सकते हैं? शायद आपके लिए एक फ़ाइल के बजाय पाइप (सरल पाइप या नामित पाइप) का उपयोग करना आपके लिए आसान है। – evnu
यदि यह मदद करता है, हालांकि ... लिखना/लिखना परमाणु हैं। इसलिए, जब तक आप गारंटी देना चाहते हैं कि आपके लेखन अन्य लेखनों के साथ मिलकर नहीं मिलते हैं, आपको बस इतना करना है कि आप जो कुछ भी लिखते हैं वह लिखने के लिए एक कॉल में फिट बैठता है()।फिर यह वास्तव में कोई फर्क नहीं पड़ता कि फ़ाइल खुली है या नहीं, ओएस इसे किसी भी तरह से हल करेगा। – Damon
संभावित डुप्लिकेट [यह सुनिश्चित करने के लिए कि इसे लिखने से पहले फ़ाइल को न पढ़ना सुनिश्चित करें] (http://stackoverflow.com/questions/3267685/how-to-make-sure-not-to-read-a- फाइल-से-फिनिशिंग-द-राइट-टू-इट) – Beginner