लॉग प्रोग्राम को हटाए गए फ़ाइल में लॉग करना कैसे जारी रख सकता है?


12

से यूनिक्स विद्युत उपकरण, 3 संस्करण : इसके बजाय एक फ़ाइल निकाला जा रहा है की, यह खाली अनुभाग:

यदि एक सक्रिय प्रक्रिया में फ़ाइल खुली होती है (लॉग फ़ाइलों के लिए असामान्य नहीं), फ़ाइल को निकालना और एक नया बनाना लॉगिंग प्रोग्राम को प्रभावित नहीं करेगा; वे संदेश बस उस फ़ाइल में जाते रहेंगे जो अब लिंक नहीं है । फ़ाइल को खाली करना एसोसिएशन को नहीं तोड़ता है, और इसलिए यह लॉगिंग प्रोग्राम को प्रभावित किए बिना फ़ाइल को साफ़ करता है।

( जोर मेरा )

मुझे समझ में नहीं आता है कि कोई प्रोग्राम हटाई गई फ़ाइल पर लॉग इन क्यों करता रहेगा। क्या यह इसलिए है क्योंकि फ़ाइल विवरणक प्रविष्टि प्रक्रिया तालिका से नहीं हट रही है?

जवाबों:


11

जब आप किसी फ़ाइल को हटाते हैं तो आप वास्तव में फ़ाइल (इनोड) के लिए लिंक हटा देते हैं। यदि किसी के पास पहले से ही वह फाइल खुली है, तो वे उस फाइल डिस्क्रिप्टर को रखने के लिए मिल जाते हैं जो उनके पास है। फ़ाइल डिस्क पर रहती है, स्थान ले रही है, और यदि आप इसे एक्सेस कर सकते हैं तो इसे लिखा और पढ़ा जा सकता है।

unlinkसमारोह POSIX करके इस व्यवहार के साथ परिभाषित किया गया है:

जब फ़ाइल की लिंक गणना 0 हो जाती है और किसी भी प्रक्रिया में फ़ाइल नहीं होती है, तो फ़ाइल पर कब्जा कर लिया गया स्थान खाली कर दिया जाएगा और फ़ाइल अब सुलभ नहीं होगी। यदि अंतिम लिंक हटाए जाने पर एक या अधिक प्रक्रियाओं में फ़ाइल खुली होती है, तो लिंक को अनलिंक () रिटर्न से पहले हटा दिया जाएगा, लेकिन फ़ाइल के सभी संदर्भ बंद होने तक फ़ाइल सामग्री को हटा दिया जाएगा

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

आखिरकार, जब डेमॉन closeफ़ाइल को समाप्त या बंद कर देता है , तो अंतरिक्ष को मुक्त कर दिया जाएगा। मतलब समय में कोई भी फाइल नहीं खोल सकता है (सिस्टम-विशिष्ट चिंतनशील इंटरफेस जैसे लिनक्स के/proc/x/fd/... माध्यम से अन्य )। यह भी गारंटी है कि:

यदि फ़ाइल की लिंक गणना 0 है, जब फ़ाइल से जुड़े सभी फ़ाइल विवरणक बंद हो जाते हैं, तो फ़ाइल के कब्जे वाले स्थान को मुक्त कर दिया जाएगा और फ़ाइल अब सुलभ नहीं होगी।

इसलिए आप अपने डिस्क स्थान को स्थायी रूप से नहीं खोते हैं, लेकिन आप फ़ाइल को हटाकर कुछ भी हासिल नहीं करते हैं और आप नए संदेशों तक पहुंच खो देते हैं।


1
यदि कोई उपयोगकर्ता (यहां रूट बताता है) तो अनलिंक करने का प्रयास क्या होगा /proc/x/fd/y? क्या यह प्रक्रिया फ़ाइल डिस्क्रिप्टर पर लिखने में विफल हो सकती है, या क्या यह एक अवैध संचालन है?
नानोफारड

@hexafraction /proc/*/fd/*वास्तविक फ़ाइलों के लिए सहानुभूति रखता है , इसलिए उन्हें हटाने से फ़ाइल नष्ट नहीं होगी। मैं आपको प्रयोग करने का सुझाव दूंगा :) (निश्चित रूप से उत्पादन प्रणाली पर नहीं!)
रुस्लान

1
@MichaelHomer शायद आप अपने उत्तर में स्पष्ट कर सकते हैं कि एक बार फ़ाइल के अनलिंक होने के बाद, फ़ाइल डिस्क्रिप्टर की ओर संकेत करने वाली प्रक्रिया इसे फिर से उसी पथ पर लिंक कर सकती है या नहीं। यह कभी-कभी उपयोगी हो सकता है।
१४:३

@ हेक्सफ़्रेक्शन खैर, ये प्रक्रिया राज्य और वस्तुओं के केवल प्रतिनिधित्व (फाइल सिस्टम में) हैं। यदि आप फ़ाइल सिस्टम में उन अभ्यावेदन को हटाते हैं, तो वास्तविक प्रक्रिया के लिए कुछ भी नहीं होना चाहिए - जब तक कि यह (या कोई अन्य प्रक्रिया) उस प्रतिनिधित्व पर निर्भर न हो। यकीन नहीं है कि आप सिस्टम के माध्यम से या बिना बताए बिना rmअंदर का उपयोग कर सकते हैं । /proc/sys
डेविड टोनहोफर

@lgeorget यह कैसे पूरा किया जाता है?
माइकल

8

बिल्कुल सही।

फाइलें त्रि-पक्षीय हैं।

  • सामग्री, बाइट्स का एक फ्लैट सरणी, जो किसी डिस्क पर कहीं लिखा होता है या ऑन-द-फ्लाई उत्पन्न होता है।
  • सूचकांक नोड , या inode छोटे के लिए है, जो एक डेटा संरचना आबादी और कर्नेल द्वारा प्रयोग किया जाता है। इसमें फ़ाइल के बारे में सभी मेटाडेटा (आकार, अनुमति, आदि) शामिल हैं, और फ़ाइल की सामग्री के स्थान को इंगित भी करता है।
  • एक या अधिक निर्देशिका प्रविष्टियों , जो ऐसे स्थान होते हैं, के रूप में चालाकी से रास्तों की तरह /home/user/personal_fileहै, जो हैंडल जिसके माध्यम से आप फ़ाइल का उपयोग कर सकते हैं, अपनी सामग्री को संशोधित रूप में कार्य, इसका मेटाडेटा आदि को बदलने

जब आप एक फ़ाइल खोलते हैं, तो आप ऑपरेटिंग सिस्टम को रास्ता देते हैं और यह आपको सीधे इनोड पर एक हैंडल लौटाता है। इस हैंडल के साथ, फ़ाइल डिस्क्रिप्टर कहा जाता है, आप चाहें तो फ़ाइल को हेरफेर कर सकते हैं (या कम से कम, जैसा कि ओएस द्वारा अनुमति दी गई है)।

आप कभी भी सीधे इनोड को नहीं हटा सकते हैं, आपको डिलीट करने के लिए ओएस को एक रास्ता देना होगा । इसलिए, जब आप किसी फ़ाइल को हटाना चाहते हैं, तो आप केवल निर्देशिका प्रविष्टि को हटाते हैं। यदि फ़ाइल में अन्य निर्देशिका प्रविष्टियाँ हैं, तो यह पहुँच योग्य रहेगी, और यदि यह नहीं भी है, तो भी इसका इनोड डिलीट नहीं किया जाएगा, जबकि फ़ाइल डिस्क्रिप्टर अभी भी इसकी ओर इशारा कर रहे हैं। @ माइकलहोमर का उत्तर इस विशिष्ट विषय पर अधिक तकनीकी और अधिक विस्तृत है।


4

अन्य 2 उत्तर अच्छी तरह से इस मुद्दे की व्याख्या करते हैं - एक फाइल "डिलीट" नहीं होती है जब तक कि सभी निर्देशिका लिंक नहीं हो जाती है और इसके लिए सभी ओपन फाइल डिस्क्रिप्टर चले गए हैं।

इससे बचने के लिए, यह उपयोग करने के लिए एक अच्छी आदत है

> /var/log/bigfile

के बजाय

rm -f /var/log/bigfile

चूँकि वह केवल सामग्री को हटाने के बजाय 0 बाइट्स पर रीसेट करता है, और आप अभी भी देख सकते हैं कि इसके लिए क्या लिखा गया है।

यदि आपने फ़ाइल को हटा दिया है, और आपके पास एक / proc / fd फाइल सिस्टम है, जहां आप अभी भी उपयोग कर सकते हैं

> /proc/12345/fd/3

फ़ाइल की सामग्री को शून्य करने के लिए (12345 आपकी प्रक्रिया आईडी है और 3 बड़ी फ़ाइल की fd संख्या है)। यह एक जीवन रक्षक हो सकता है अगर आपकी डिस्क पूरी चल रही है और आप उस प्रक्रिया को नहीं मार सकते हैं जो किसी कारण से आपकी लॉग फ़ाइल लिख रही है।


> /var/log/bigfileफ़ाइल में मौजूदा डेटा को निकालता है, लेकिन प्रोग्राम को वहां लिखने से नहीं रोकता है। बहुत कम ही परिस्थितियाँ ऐसी हैं जहाँ यह सही बात है। मैं कहूंगा कि यह एक बुरी आदत है। यदि आप किसी फ़ाइल को हटाना चाहते हैं, तो उपयोग करें rm। यदि आप वहां लिखने वाले कार्यक्रमों को रोकना चाहते हैं, तो उन्हें मारें या अन्यथा उन्हें लिखना बंद करें, हटाने से पहले या बाद में।
गाइल्स 'एसओ- बुराई को रोकना'

1
@Giles, यह विषय इस तथ्य के बारे में है कि यदि किसी प्रोग्राम में अभी भी फ़ाइल खुली है, तो उसे हटाने में मदद नहीं मिलेगी। और अगर आपकी डिस्क भरी हुई है क्योंकि कुछ प्रोग्राम दुर्व्यवहार करता है और syslogdभरता है /var/log/messages, > /var/log/messagesतो मारने से बेहतर विकल्प है syslogd। बेशक, यह आपको विश्लेषण करने से नहीं रोकना चाहिए कि पहली समस्या क्या है।
गुंतराम ब्लोह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.