2009-02-26 9 views
8

मैं एक फ़ाइल खोलना चाहता हूं जो समय-समय पर किसी अन्य एप्लिकेशन द्वारा लिखी जाती है। इस एप्लिकेशन को संशोधित नहीं किया जा सकता है। इसलिए मैं केवल फाइल खोलना चाहता हूं जब मुझे पता है कि यह किसी अन्य एप्लिकेशन द्वारा नहीं लिखा गया है।पायथन - यह जांचने के लिए कि किसी अन्य एप्लिकेशन द्वारा फ़ाइल का उपयोग कैसे किया जाता है?

क्या ऐसा करने के लिए कोई पागल तरीका है? अन्यथा, मैं इसे यूनिक्स और विंडोज में कैसे प्राप्त करूं?

संपादित करें: मैं कोशिश करूँगा और स्पष्टीकरण दूंगा। क्या यह जांचने का कोई तरीका है कि वर्तमान फ़ाइल किसी अन्य एप्लिकेशन द्वारा खोली गई है या नहीं?

मैं इस प्रश्न से शुरू करना चाहता हूं। चाहे वे अन्य एप्लिकेशन पढ़/लिखना अब के लिए अप्रासंगिक है।

मुझे एहसास है कि यह शायद ओएस निर्भर है, इसलिए यह वास्तव में अभी पाइथन से संबंधित नहीं हो सकता है।

+0

क्या आप लॉग रोटेशन प्राप्त करने की कोशिश कर रहे हैं ?? – vladr

+0

बिल्कुल नहीं, लेकिन बहुत दूर नहीं है। मैं एक मौजूदा के शीर्ष पर एक एप्लीकेशन बनाना चाहता हूं। –

उत्तर

7

क्या आपकी पाइथन लिपि लिखने या पढ़ने के लिए फ़ाइल खोलने की इच्छा रखती है? क्या विरासत एप्लिकेशन लिखने के बीच फ़ाइल खोल रहा है और बंद कर रहा है, या क्या यह इसे खुला रखता है?

यह बेहद जरूरी है कि हम समझें कि विरासत आवेदन क्या कर रहा है, और आपकी पाइथन लिपि क्या हासिल करने का प्रयास कर रही है।

कार्यक्षमता का यह क्षेत्र अत्यधिक ओएस-निर्भर है, और तथ्य यह है कि आपके पास विरासत अनुप्रयोग पर कोई नियंत्रण नहीं है केवल दुर्भाग्य से चीजों को कठिन बनाता है। चाहे ऐसा करने के लिए एक पाइथोनिक या गैर-पायथनिक तरीका है, शायद आपकी चिंताओं का सबसे कम होगा - कठिन सवाल यह होगा कि आप जो हासिल करने की कोशिश कर रहे हैं, वह संभव होगा।


अद्यतन

ठीक है, (अपनी टिप्पणी से) तो जानते हुए भी कि:

विरासत आवेदन खोल रहा है और फ़ाइल हर एक्स मिनट बंद करने, लेकिन मुझे नहीं पता यह मानना ​​है कि टी = t_0 + n * एक्स + eps पर यह पहले से ही फ़ाइल बंद कर दिया गया है।

तो समस्या के पैरामीटर बदल दिए गए हैं। यह वास्तव में कुछ मान्यताओं, या ओएस-निर्भर और ओएस-स्वतंत्र तकनीकों के संयोजन के रूप में एक ओएस-स्वतंत्र तरीके से किया जा सकता है। :)

  1. ओएस-स्वतंत्र तरीके: अगर यह मान लेना कि विरासत आवेदन फाइल ज्यादा से ज्यादा समय की कुछ ज्ञात मात्रा के लिए खुला रहता है सुरक्षित है, कहते हैं कि T सेकंड (जैसे, फ़ाइल को खोलता है एक लिखने करता है , फिर फ़ाइल को बंद कर देता है), और प्रत्येक X सेकंड में इसे कम या कम खुलता है, जहां X 2 * T से बड़ा है।
    • stat फ़ाइल
    • घटाना now() से फाइल के संशोधन समय, उपज D
    • अगर T < = D < X तो फ़ाइल को खोलने और आप इसे
    • साथ की जरूरत है यह काफी सुरक्षित किया जा सकता है कर आपके आवेदन के लिएT/X के रूप में सुरक्षा बढ़ जाती है। * निक्स पर आपको उचित समय-चरणबद्ध बनाम स्लीव कॉन्फ़िगरेशन (टिंकर देखें) के लिए /etc/ntpd.conf को दोबारा जांचना पड़ सकता है। विंडोज के लिए देखें MSDN
  2. विंडोज: (या इन-एवज) ऊपर ओएस स्वतंत्र विधि के अलावा, आप का उपयोग करने के प्रयास कर सकते हैं या तो:
    • शेयरिंग (ताला लगा): इस मानता है कि विरासत कार्यक्रम भी साझा मोड में फ़ाइल खोलता है (आमतौर पर विंडोज़ ऐप्स में डिफ़ॉल्ट); इसके अलावा, यदि आपका एप्लिकेशन लॉक प्राप्त करता है जैसे विरासत एप्लिकेशन एक ही (दौड़ की स्थिति) का प्रयास कर रहा है, तो विरासत आवेदन विफल हो जाएगा।
      • यह बेहद घुसपैठ और त्रुटि प्रवण है। जब तक कि नए एप्लिकेशन और विरासत अनुप्रयोग दोनों को एक ही फ़ाइल में लिखने के लिए सिंक्रनाइज़ करने की आवश्यकता नहीं होती है और आप फ़ाइल के उद्घाटन से वंचित विरासत एप्लिकेशन की संभावना को संभालने के इच्छुक हैं, तो इस विधि का उपयोग न करें।
    • पता लगाने के लिए क्या फ़ाइलें ProcessExplorer रूप में एक ही तकनीक का उपयोग विरासत आवेदन में खुले हैं, प्रयास कर (के बराबर * nix के lsof)
      • आप और भी अधिक कमजोर ओएस की तुलना में स्थिति दौड़ के लिए कर रहे हैं स्वतंत्र तकनीक
  3. लिनक्स/आदि।: इसके अलावा में (या इन-एवज) ऊपर ओएस स्वतंत्र विधि की, तो आप कुछ सिस्टम पर, बस की जाँच जो
      आप
    • को प्रतीकात्मक कड़ी /proc/<pid>/fd/<fdes> अंक फाइल lsof के रूप में उसी तकनीक का उपयोग करने के लिए प्रयास कर सकते हैं या, ओएस-स्वतंत्र तकनीक
    • की तुलना में दौड़ की स्थिति के लिए और भी कमजोर हैं, यह बेहद असंभव है कि विरासत एप्लिकेशन लॉकिंग का उपयोग करता है, लेकिन यदि ऐसा है, तो लॉकिंग वास्तविक विकल्प नहीं है जब तक कि विरासत एप्लिकेशन लॉक फ़ाइल को गर्व से संभाल नहीं सकता अवरुद्ध करके, अवरुद्ध नहीं - और यदि आपका स्वयं का आवेदन गारंटी दे सकता है कि फ़ाइल लॉक नहीं रहेगी, तो समय के विस्तार के लिए विरासत आवेदन को अवरुद्ध कर दिया जाएगा।)

अद्यतन 2

तो पक्ष "जाँच विरासत आवेदन फाइल खुला है या नहीं" (दखल दृष्टिकोण की स्थिति दौड़ के लिए प्रवण) तो आप ने कहा कि दौड़ हल कर सकते हैं द्वारा शर्त:

  1. जांच कर रहा है कि विरासत एप्लिकेशन में फ़ाइल खुली है (एक ला lsof या ProcessExplorer)
  2. विरासत आवेदन प्रक्रिया को निलंबित
  3. चरण 1 में चेक दोहराने के लिए यह पुष्टि करने के लिए कि विरासत अनुप्रयोग चरण 1 और 2 के बीच फ़ाइल नहीं खोलता है; देरी और चरण 1 पर पुनरारंभ करें, अन्यथा चरण 4
  4. फ़ाइल पर अपना व्यवसाय करने के लिए आगे बढ़ें - आदर्श रूप से इसे कम से कम समय के लिए निलंबित किया गया है, विरासत आवेदन को कम से कम
  5. के लिए निलंबित किया गया है
  6. विरासत अनुप्रयोग प्रक्रिया को फिर से शुरू करने
+0

विरासत एप्लिकेशन प्रत्येक एक्स मिनट में फ़ाइल खोल रहा है और बंद कर रहा है, लेकिन मैं यह नहीं मानना ​​चाहता कि टी = t_0 + n * X + eps पर यह पहले ही फ़ाइल बंद कर दिया गया है। –

0

यूनिक्स में डिफ़ॉल्ट रूप से फ़ाइल लॉकिंग नहीं है। यूनिक्स पर्यावरण के लिए मेरे पास सबसे अच्छा सुझाव है lsof कमांड के स्रोतों को देखना होगा। इसमें गहरी जानकारी है कि किस प्रक्रिया में कौन सी फाइलें खुलती हैं। आप इसे अपने समाधान के आधार के रूप में उपयोग कर सकते हैं। यहां Ubuntu sources for lsof.

+0

ऐसा लगता है कि यह यूनिक्स पर एक अच्छा समाधान हो सकता है। मैं बस उस फ़ाइल के लिए lsof के आउटपुट को पार्स कर सकता हूं जिसे मुझे एक्सेस करने से पहले चाहिए। लॉक के बिना पूरी तरह से सुरक्षित नहीं है, लेकिन मैं केवल 99.99% मामलों में शुद्धता को संभाल सकता हूं। मुझे विंडोज़ के लिए भी एक समाधान की आवश्यकता है। –

0

एक चीज जो मैंने किया है, में पाइथन बहुत अस्थायी रूप से फ़ाइल का नाम बदलता है। अगर हम इसका नाम बदल सकते हैं, तो कोई अन्य प्रक्रिया इसका उपयोग नहीं कर रही है। मैंने केवल विंडोज़ पर इसका परीक्षण किया।

+1

वाक्यांश "दौड़ की स्थिति" स्प्रिंग्स को दिमाग में: - / –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^