2009-11-18 13 views
9

मैं एक क्रॉन स्क्रिप्ट का उपयोग कर अपने लॉग फ़ाइल आकार को प्रबंधित करने की कोशिश कर रहा हूं। मैं मूल रूप से हर रात लॉग फ़ाइल की आखिरी 2000 लाइनों को हटाना चाहता हूं। मैं इस आदेश को चलाने के लिए कोशिश कर रहा हूँ, लेकिन यह पूरी फ़ाइल खाली किए जाने की बजाय मेरा इच्छित लगता है:लॉग फाइलों को छोटा करने के लिए "पूंछ" क्यों काम नहीं करता है?

पूंछ -2000 logfile.txt> logfile.txt

किसी को क्यों इस isn पता है ' मैं काम नहीं कर रहा हूं और/या मैं जो चाहता हूं उसे पूरा करने के लिए कैसे? धन्यवाद!

उत्तर

14

tail से पहले आप फ़ाइल को ओवरराइट कर रहे हैं, इसे पढ़ने के लिए भी शुरू होता है। शेल फ़ाइल को साफ़ करके > रीडायरेक्ट ऑपरेटर को संसाधित करता है। फिर यह tail चलाता है जिसमें पढ़ने के लिए कोई डेटा नहीं है।

तुम एक अस्थायी फ़ाइल का उपयोग करके इस का समाधान कर सकते हैं:

tail -2000 logfile.txt >logfile.tmp 
mv logfile.tmp logfile.txt 
+0

'> logfile.txt' - का मतलब है नई फ़ाइल –

+2

हाँ, लेकिन अगर फ़ाइल नाम इनपुट के समान है, तो यह – Patonza

+0

को ओवरराइट करेगा, यह केवल तभी काम करता है जब लॉगफाइल पर लिखने की प्रक्रिया अपनी फ़ाइल डिस्क्रिप्टर को बंद कर देती है। विशिष्ट, लेकिन हमेशा सच नहीं है। – NVRAM

1

ग्रेग Hewgill सही है, इससे पहले कि पूंछ इस पर काम कर सकते हैं logfile.txt छोटा कर दिया जा रहा है।

कोशिश:

tail -2000 logfile.txt > logfile2.txt; rm -f logfile.txt; mv logfile2.txt logfile.txt 
+0

इस मामले में 'आरएम 'अनावश्यक है क्योंकि नाम के दौरान' mv' गंतव्य फ़ाइल को अनलिंक कर देगा। –

+0

ठीक है ... मैं केवल अनावश्यक था: पी – Patonza

+0

यह केवल तभी काम करता है जब लॉगफाइल को लिखने की प्रक्रिया अपनी फ़ाइल डिस्क्रिप्टर को बंद कर देती है। विशिष्ट, लेकिन हमेशा सच नहीं है। – NVRAM

9

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

कमांड लाइन

से आदमी पेज here या प्रकार man logrotate देखें अपने /etc/logrotate.d/ निर्देशिका में एक नया logrotate फ़ाइल बनाएँ। यहाँ एक उदाहरण है:

/var/logs/myapp/logfile.txt { 
    # keep the 5 latest rotations of the log 
    rotate 5 
    # rotate once the file is bigger than 2k 
    size 2k 
    # don't error if the file isn't there 
    missingok 
    # compress rotated (old) log files 
    compress 
    # set ownership and permissions on the new log file 
    create 0640 myuser myuser 
} 
10

वहाँ स्वीकार कर लिया समाधान के साथ एक समस्या है अगर प्रक्रिया खुला लॉग फ़ाइल रखता है; आपको मूल रूप से आई-नोड का पुन: उपयोग करने की आवश्यकता है। Mmrobins 'प्रतिक्रिया अच्छी है, logrotate सही बात करना चाहिए।

पूंछ का उपयोग करने के लिए आपको कुछ (Pantonza के & ग्रेग के विचार के समान) कर सकते हैं, लेकिन इन-जगह मूल फ़ाइल को छोटा करके मूल फ़ाइल को बनाए रखें:

tail -2000 logfile.txt >logfile.tmp 
cat logfile.tmp > logfile.txt 
rm logfile.tmp 

एक अस्थायी फ़ाइल बचने के लिए, आप एक चर में पढ़ सकते हैं, फिर इसे वापस सामान:

bash -c 'X=$(tail -2000 logfile.txt);echo "$X">logfile.txt' 

सभी मामलों में, आपकी काट-छांट और इस प्रक्रिया फाइल करने के लिए जोड़कर जो रेस स्थिति की संभावना है। सुनिश्चित नहीं है कि logrotate हैंडल करता है कि पूंछ समाधान में से कोई भी समाधान नहीं करता है।

4

इधर, एक अन्य समाधान है tmp फाइलों के साथ काम कर के बिना:

echo "`tail -2000 logfile.txt`" > logfile.txt 
+0

मुझे समस्या थी कि मैं एक खुली फ़ाइल डिस्क्रिप्टर वाली फ़ाइल को छोटा करने की कोशिश कर रहा था। तो एक टीएमपी फाइल एक विकल्प नहीं था। धन्यवाद! –

1

आप एक vim उपयोगकर्ता तब एक और विकल्प tail के बजाय vi उपयोग करने के लिए, सीधे फाइल पर संचालित करने के लिए है रहे हैं:

vi "+execute \"normal! G2000kO\<esc>dgg\"" "+w" "+q" logfile.txt 

स्ट्रिंग G2000kO\<esc>dgg बस कीबोर्ड इनपुट है जिसे आप vi के साथ करने के लिए उपयोग करेंगे (भागने वाला बटन बच जाना चाहिए)। उपयोग के मामलों की एक विस्तृत श्रृंखला का उपयोग और कवर करने के लिए यह बहुत सहज है।

vi भी धीमा किए बिना बड़ी (10+ जीबी) टेक्स्टफाइल को संभालता है, इसलिए यह विधि बहुत मजबूत है।

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