2010-02-25 15 views
5

मैं एक ऐसी प्रणाली विकसित कर रहा हूं जो एक यूएसपीएस शिपिंग पैकेज के साथ इंटरफेस करता है जिसे डैज़ल कहा जाता है। इस प्रणाली के एक भाग में एक निगरानी डिमन शामिल है जिसका उद्देश्य टैब से अलग मूल्य फ़ाइलों को लेना है, उन्हें एक्सएमएल में बदलना है जो चमकदार पहचानता है, और उन्हें लेबल पीढ़ी के लिए चमकदार रूप से पास करता है। और यह हिस्सा बस ठीक काम करता है। मैं जो भी करना चाहता हूं, वह है, आउटपुट फ़ाइल को पार्स करना है जो Dazzle उत्पन्न करता है और इसे डेटाबेस में आयात करता है।मेरे लिनक्स डिमन को कैसे पता चलेगा कि एक विंडोज प्रोग्राम ने एक फाइल लिखना बंद कर दिया है जिसे मैं सैम्बा के माध्यम से एक्सेस करता हूं?

यहां ध्यान दें कि विंडोज़ पर चमकदार चलता है। मेरा निगरानी डिमन पर्ल में लिखा गया है और लिनक्स पर चलता है। मेरे लिनक्स सिस्टम में सांबा के माध्यम से डाज़ल की इनपुट और आउटपुट निर्देशिकाएं हैं।

डैज़ल आउटपुट फ़ाइल लिखने और उस समय समाप्त होने के बीच एक मापनीय देरी है। मैं क्या जानना चाहता हूं कि आउटपुट फ़ाइल लिखने के लिए मैं चमकदार के लिए कैसे इंतजार कर सकता हूं? मैंने फ़ाइल खोलने और flock($fh, LOCK_SH) पर ऐसा करने का प्रयास किया है, लेकिन ऐसा कोई अच्छा प्रतीत नहीं होता है।

EDIT: मेरे पास नीचे "mobrule" की टिप्पणी के आधार पर एक विचार है। चमकदार एक्सएमएल में आउटपुट फाइल लिखता है। शिपमेंट में प्रत्येक पैकेज टैग में संलग्न है, और पूरा दस्तावेज़ एक टैग में संलग्न है। इसलिए, यदि मैं इसे पूरा करने से पहले फ़ाइल को पढ़ना शुरू करता हूं, तो मैं कार्रवाई करने से पहले उचित समापन टैग की प्रतीक्षा कर सकता हूं।

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

उत्तर

1

यह शायद एक अच्छा समाधान नहीं है, लेकिन आप बार-बार फ़ाइल का नाम बदलने का प्रयास कर सकते हैं, अगर यह विफल हो जाता है तो थोड़ा सा सो जाओ।

1

आप लॉक डब्ल्यू/LOCK_EX करने का प्रयास कर सकते हैं - और यदि लॉक विफल हो जाता है, तो इसका मतलब है कि यह अभी भी लिखा जा रहा है। जब तक आप ताला प्राप्त नहीं करते तब तक स्पिन करें, और चकाचौंध किया जाना चाहिए। यह विफल हो जाएगा यदि Dazzle कभी भी फ़ाइल बंद कर देता है और इसे फिर से खोलता है w/append मोड, तो यह सबसे अच्छा समाधान नहीं है।

+0

यह केवल तभी सही है जब Dazzle उसी लॉकिंग तंत्र का उपयोग करके फ़ाइल को लॉक कर रहा हो। यह संभावना नहीं है और विशेष रूप से असंभव है अगर Dazzle एक पर्ल स्क्रिप्ट नहीं है। – mob

+0

यह एक अच्छा बिंदु है - डैज़ल एक विंडोज़ एप्लीकेशन है और पर्ल में लिखा नहीं है। इसलिए पर्ल में फ़ाइल लॉक केवल "सलाहकार" हैं, जो काम नहीं करेंगे। दयालुता, 'अन्यथा यह मैंने सुना है कि सबसे अच्छा समाधान है। –

1

शायद आप डैज़ल को एक डमी या फ्लैग फ़ाइल लिख सकते हैं (इसमें कुछ भी हो सकता है जो आप दिनांक/समय टिकट या अनुक्रम संख्या की तरह चाहते हैं) यह इंगित करने के लिए कि Dazzle ने फ़ाइल लिखना समाप्त कर दिया है। फिर आप जो भी करते हैं, वह यह जानने के लिए परीक्षण करता है कि यह समाप्त हो गया है।

5

कुछ सामान्य और पोर्टेबल तरीका यह बताने के लिए है कि कुछ प्रक्रियाओं में कुछ मनमानी फ़ाइल के लिए एक खुली फ़ाइल हैंडल है या नहीं। आपको स्थिति के अपने स्थानीय ज्ञान के साथ निर्णय लेना होगा।

इस मामले में, विंडोज मशीन पर प्रक्रिया तालिका से पूछना संभव हो सकता है कि यह देखने के लिए कि "चमकदार" प्रोग्राम अभी भी चल रहा है या नहीं। या हो सकता है कि आपका अनुभव आपको अन्य दिशानिर्देश देता है, जैसे "इनपुट उचित होने पर चमकने के लिए 20 सेकंड से अधिक समय नहीं लेता" या "जब चमकदार चल रहा है, तो यह प्रत्येक दो सेकंड में फ़ाइल अपडेट करता है। अगर फ़ाइल को अपडेट नहीं किया गया है कहते हैं, 10 सेकंड, फिर एक बहुत अच्छा मौका है कि चमकदार खत्म हो गया है। "

लेकिन आपको डैज़ल समाप्त होने तक प्रतीक्षा करने की आवश्यकता नहीं है। फाइल को पढ़ने के लिए बिल्कुल ठीक है, उसी समय डैज़ल इसे लिख रहा है - the perldoc for the seek function देखें, "tail -f अनुकरण कैसे करें" के बारे में इस हिस्से पर ध्यान देना। फिर आप चमकते चलते समय अपना डेटाबेस अपडेट कर सकते हैं।

इस तरह, यदि आप डैज़ल समाप्त होने पर अनुमान लगाने के बारे में बहुत रूढ़िवादी हैं, तो आपका डेटाबेस अभी भी समय पर अपडेट किया जाएगा, और केवल लागत कुछ बेकार खोज और ईओएफ पर फाइलहेडल पर कॉल पढ़ेगी।

+0

ठीक है, मैं वास्तव में अपने डेटाबेस को अद्यतन नहीं कर सकता, जबकि चमकदार चल रहा है, क्योंकि मैं अपने डेटाबेस को Dazzle के XML आउटपुट को पार्स करने के परिणामों से अद्यतन कर रहा हूं। यद्यपि शायद मुझे एक पार्सर मिल सकता है, या अपना खुद का छोटा पार्सर लिख सकता है, जिसके लिए दस्तावेज़ को पार्सिंग शुरू करने के लिए पूरा करने की आवश्यकता नहीं है। –

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

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