कैसे लॉगऑन करने के बाद एक फ़ाइल को पुन: निर्देशित करने के लिए जारी रखने के लिए इसे स्थानांतरित करता है?


22

मेरे पास एक सरल स्क्रिप्ट है जो स्क्रीन पर लॉग का एक गुच्छा आउटपुट करता है और मैंने लॉग को स्टोर करने के लिए एक फाइल में STDOUT को पाइप किया। चूंकि यह स्क्रिप्ट लंबे समय से चल रही है, इसलिए मुझे लॉग फ़ाइलों को घुमाने की जरूरत थी ताकि वे छोटे से अधिक प्रबंधनीय में चुभ जाएं।

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

मुझे यह पोस्ट भी मिली जिसमें मेरे जैसी ही समस्या थी और उनका दावा है कि आउटपुट को रीडायरेक्ट करने के >>बजाय इसका उपयोग करके इसे ठीक किया जा सकता है >। मैंने उसके समाधान का परीक्षण किया लेकिन यह मेरे लिए कारगर नहीं रहा। क्या किसी के पास कोई विचार है कि पुनर्निर्देशन को कैसे रखा जाए?


4
मैं फिर भी, आपके मामले में, ">" के बजाय ">" का उपयोग करने की सलाह दूंगा, यदि आप एक छंटनी की गई फ़ाइल में लिखने का इरादा रखते हैं: जैसा कि ">>" एपेंड मोड में खुला है, यह फ़ाइल के अंत तक तलाश करेगा। हर बार लिखता है। इस तरह, जब आप फ़ाइल को काटते हैं (इसे XXXX बाइट्स से 0 बाइट्स तक ले जाते हैं), तो यह "अंत तक की तलाश करेगा", इसलिए यह पता चलेगा कि अब इसे बाइट के बाद लिखना होगा। अन्यथा यह बाइट XXXX के बाद लिख सकता है, और इस प्रकार XXXX नल बाइट्स के साथ एक विरल फ़ाइल बनाएं, इससे पहले (यानी, ""> ", fd बस याद कर सकता है कि यह उस फ़ाइल में कहां था, और वहां से लिखें, बिना फ़ाइल आकार के सिकुड़न का एहसास किए!)
ओलिवियर बलैक

जवाबों:


25

आपको इस लॉग फ़ाइल के लिए अपने लॉगोटेट कॉन्‍फ़िगरेट में copytruncate निर्देश का उपयोग करना चाहिए।

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


2
ध्यान देने योग्य हो सकता है: compressऑपरेशन से पहले थोड़े समय के लिए, डेटा को डुप्लिकेट किया जाता है। इससे हमें एक बार समस्या हुई लेकिन यह हमारी बुरी बात थी क्योंकि हमें lvअंतरिक्ष की सीमा के करीब नहीं होना चाहिए था । इसके अलावा, जैसा कि manस्निपेट में कहा गया है , आप कॉपी और ट्रंकट संचालन के बीच कुछ लॉग डेटा खो सकते हैं।
बेलमिन फर्नांडीज

6

एक विकल्प के रूप में, आप यह भी कर सकते हैं:

  • उदाहरण के लिए, एक समर्पित सुविधा (जैसे कि स्थानीय 5) के साथ, पाइपिंग के बजाय अपनी स्क्रिप्ट में लकड़हारा उपयोगिता का उपयोग करें:

    logger -p local5.info -t myscriptname "this is some log data"

  • लॉग फ़ाइल, उदाहरण (rsyslog.conf) के लिए यह सुविधा लिखने के लिए syslog कॉन्फ़िगर करें:

    local5.* /var/log/mylogfile

  • इस लॉग के लिए सेटअप लॉगरोट नियम।


यह केवल तभी काम करता है जब आपके पास स्पष्ट आउटपुट कमांड हों जैसे echo। थर्ड पार्टी टूल्स का आउटपुट जिसे स्क्रिप्ट से पुकारा जाता है और आउटपुट भी कुछ इस तरह
डैनियल एल्डर

4

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

की सामग्री /etc/logrotate.d/your-script-name:

/var/log/your-script-name.log {
    # your current logrotate options
    ...
    postrotate
        # this supposing you have the current pid stored
        cat /run/your-script-name.pid | xargs -r kill
        #relaunch it again
        /usr/local/bin/your-script-name
    endscript
}

0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.