क्या नामांकित पाइप रिटर्न पर तलाश () संचालन सफल होना संभव है?


12

क्या इसे बनाने का कोई तरीका है ताकि जब प्रोग्राम seek()एक नामित पाइप पर संचालन करने का प्रयास करें तो यह वापस आ जाए ('एलीग्ल सीक' के बजाय यह काम करेगा जैसे कि पाइप एक खाली फ़ाइल थी)?

मैं अपने सिस्टम पर SQLite डेटाबेस में संग्रहीत लॉगिंग के हर अंतिम थोड़ा सा है, मेरे पास कहीं भी फाइलें नहीं हैं। हालाँकि कुछ कार्यक्रम ऐसे हैं जिनसे परेशानी होती है। 2 विशिष्ट मामले हैं;

  • एक प्रोग्राम एक लॉग फ़ाइल को लिखना चाहता है जो syslog-ng ने एक नामित पाइप के रूप में बनाया है और से पढ़ रहा है। कार्यक्रम seek()किसी कारण से प्रदर्शन करना चाहता है और फिर विफल हो जाता है।
  • एक प्रोग्राम (जैसे कि denyhosts या fail2ban) एक लॉग फ़ाइल से पढ़ना चाहता है, जिसे syslog-ng ने एक नामांकित पाइप के रूप में बनाया है और वह लिख रहा है। कार्यक्रम उस seek()पर प्रदर्शन करना चाहता है और विफल रहता है।

आदर्श रूप में मैं सिर्फ ये चाहता हूं कि जैसे कि नामित पाइप सिर्फ एक खाली फाइल थी। मुझे कोई कारण नहीं दिख रहा है कि लॉग लिखने वाले प्रोग्राम को किसी भी तरह की तलाश करने की आवश्यकता होगी, इसे सिर्फ ऐपेंड के लिए फाइल खोलना चाहिए और लिखना शुरू करना चाहिए। मैं देख सकता हूं कि एक प्रोग्राम रीडिंग क्यों लेना चाहता है, ताकि वह अपने अंतिम स्थान से फिर से शुरू कर सके, और इसलिए मैं इसे व्यवहार करना चाहूंगा जैसे कि फ़ाइल खाली थी (जैसे कि इसे काट दिया गया था)।

तो क्या कुछ विकल्प है जो नामित पाइपों पर सेट किया जा सकता है ताकि उन्हें इस तरह से व्यवहार किया जा सके? यदि कोई ऐसा मोड नहीं है जिसे सेट किया जा सकता है जब syslog- एनजी पाइप को खोलता है तो क्या यह इस तरह से व्यवहार करता है (मैं कोड परिवर्तन करने के लिए खुला हूं)? या मैं एक नाला हूँ?

जवाबों:


10

लिनक्स कर्नेल के लिए शोध योग्य पाइप प्रस्तावित किए गए हैं, लेकिन मुझे उन्हें लागू करने के लिए काम करने वाले पैच के बारे में पता नहीं है।

आप एक LD_PRELOAD'एड लाइब्रेरी' का उपयोग कर सकते हैं जो lseekविशिष्ट फाइलों पर कॉल को ओवरराइड करता है। मैं इस उद्देश्य के लिए किसी भी ऑफ-द-शेल्फ आवरण के बारे में नहीं जानता। शैडोफोर्स एक लिखने में मदद कर सकते हैं।


1
मैं LD_PRELOAD मार्ग आज़माऊंगा। सबसे बड़ा समाधान नहीं, लेकिन करने योग्य होना चाहिए।
पैट्रिक

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

@PiotrDobrogost Fकम में कमांड के संदर्भ में , स्क्रीन को ताज़ा करने के लिए कम के लिए पर्याप्त होगा यदि इसे एक या दूसरे सेकंड के लिए कोई आउटपुट नहीं मिलता है। पाइप को खोजने योग्य बनाने में मदद नहीं करेगा: प्रासंगिक अंतर यह है कि Fफ़ाइल के अंत में जाता है, फिर डेटा के अंत में आने का इंतजार करता है - लेकिन एक पाइप के लिए, फ़ाइल का अंत केवल तब आता है जब लेखक फ़ाइल को बंद कर देता है।
गिलेस एसओ- बुराई को रोकना '

1

यदि आवेदन कॉल की तलाश है, तो यह या तो टूट गया है, या पाइप पर काम करने के लिए नहीं है। यदि पूर्व, तो इसे ठीक करने की आवश्यकता है। यदि उत्तरार्द्ध, तो यह वास्तव में काम करने की तलाश करने वालों से अपेक्षा करता है, इसलिए झूठ बोलना और यह दावा करना कि जब यह लगभग निश्चित रूप से गलत संचालन का कारण नहीं था।

इसके अलावा यदि लॉग फ़ाइल को नामित पाइप से बदल दिया जाता है, तो एक समय में केवल एक प्रक्रिया इसे पढ़ सकती है। इसकी जगह सॉकेट होना चाहिए।


2
पाइप पर काम करने का मतलब नहीं है पाइप पर खिचड़ी भाषा का काम करना। क्या होगा यदि एप्लिकेशन फ़ाइल के अंत में जाने के लिए बस एक SEEK_END कर रहा है? या हो सकता है कि वर्तमान स्थान खोजने के लिए SEEK_CUR कर रहा हो। अगर मैं कार्यक्रम के परिणामों के बारे में झूठ बोलता हूं, तो इनमें से कोई भी समस्या का कारण नहीं बनेगा। एकमात्र स्थान जो टूट जाएगा, यदि एप्लिकेशन वापस जाने की कोशिश कर रहा था और पहले से लिखे गए डेटा को अधिलेखित कर रहा था, जिसे लॉग फ़ाइलों के साथ नहीं करना चाहिए। और हाँ, मुझे एक-प्रक्रिया-प्रति-पाइप सीमा के बारे में पता है। यह कोई समस्या नहीं होगी।
पैट्रिक

1
यदि यह सब करता है, तो इसे समाप्त करने के लिए तलाश की जाती है, तो यह सिर्फ फ़ाइल को ऐपेंड मोड में खोलना चाहिए, इसलिए यह टूटी हुई श्रेणी में आता है। अनुप्रयोग वर्तमान स्थान को खोजने का प्रयास नहीं करते हैं जब तक कि उन्हें कहीं और तलाश करने में सक्षम होने की आवश्यकता नहीं होती है, और फिर वर्तमान स्थान पर वापस आ जाते हैं, इसलिए यह "आप इसे चुपचाप विफल होने से तोड़ देंगे" श्रेणी में आते हैं। यह बहुत कम संभावना नहीं है कि कोई प्रोग्राम कॉल चाहता है, लेकिन वास्तव में इसे काम करने की आवश्यकता नहीं है (और यदि ऐसा होता है, तो यह टूटी हुई श्रेणी में आता है)।
psusi

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

1
@Patrick, पूर्व के लिए, यदि यह इसे जोड़ रहा है तो इसे एपेंड मोड में फाइल को फिर से खोलना चाहिए। इस मामले में आप पढ़ने के बारे में बात कर रहे हैं, जिस स्थिति में, यह नए डेटा को छोड़ने के लिए समझ में नहीं आता है जो अभी तक पढ़ा नहीं है (और चुपचाप इस बात की अनदेखी करते हुए कि वह टूट जाएगा)। उत्तरार्द्ध के लिए, यदि यह बंद करने के बाद उसी स्थिति में लौटने के लिए खोज का उपयोग करने की कोशिश कर रहा है और उस फ़ाइल को फिर से खोलना है जो पाइप पर टूट जाएगी यदि आप चुपचाप साधक को अनदेखा करते हैं, तो जब पाइप बंद हो जाता है तो सर्वर को एक SIGPIPE मिलता है, जो संभवत: इसे रीसेट कर दिया जाता है ताकि पाइप को खोलने वाला अगला क्लाइंट शुरुआत में शुरू हो।
Psusi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.