2011-12-27 14 views
15

मेरे पास रोलिंग लॉग फ़ाइलों से भरा एक निर्देशिका है जिसे मैं पूंछ का उपयोग करने में सक्षम होना चाहता हूं।टेलिंग रोलिंग फ़ाइलें

फ़ाइलों जैसे नाम हैं:

name  modified 
00A.txt Dec 27 19:00 
00B.txt Dec 27 19:01 
00C.txt Dec 27 19:02 
00D.txt Dec 27 19:03 

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

tail -100f `ls -t | head -1` 

वांछित व्यवहार, ऊपर फ़ाइल नामों को देखते हुए इस तरह जाना होगा:

./logtailer.sh 

फिर स्क्रिप्ट 00D.txt पीछा शुरू होगा। जैसे ही लॉगर 00D.txt पर लिखना समाप्त हो गया था और नवीनतम लॉग फ़ाइल को अब 00E.txt नाम दिया गया था, प्रोग्राम स्वचालित रूप से उस फ़ाइल को पूंछ शुरू कर देगा।

कोई व्यक्ति "फ़ाइल प्रशासित बंद" टेक्स्ट के लिए पूंछ के आउटपुट को देखकर और फिर निम्न आदेश को फिर से चलाकर इस स्क्रिप्ट को लिख सकता है।

tail -100f `ls -t | head -1` 

वहाँ "प्रशासनिक रूप से बंद फ़ाइल" पाठ के लिए देख कर की तुलना में यह करने के लिए एक और अधिक सुरुचिपूर्ण रास्ता नहीं है? मैं शेल स्क्रिप्ट में लाइन द्वारा पूंछ रेखा के आउटपुट को भी कैसे पढ़ सकता हूं?

संपादित करें: मुझे समझाया जाना चाहिए कि पूंछ के लिए एफएफ ध्वज इस प्रणाली पर मेरे लिए एक विकल्प नहीं है। यह पूंछ के एक अलग संस्करण का उपयोग करता है जिसमें यह सुविधा नहीं है। ओएस संस्करण - सोलारिस 10

उत्तर

19

आप tail के लिए -F विकल्प का उपयोग कर सकते हैं जो --follow=name --retry का तात्पर्य है।

man पृष्ठ से:

-F  
The -F option implies the -f option, but tail will also check to see if the 
file being followed has been renamed or rotated. The file is closed and 
reopened when tail detects that the filename being read from has a new inode 
number. The -F option is ignored if reading from standard input rather than 
a file. 
+0

मुझे लगता है मैं इस ध्वज इस्तेमाल कर सकते हैं, लेकिन मेरी संस्करण पूंछ के पास यह सुविधा नहीं है और मेरे पास इसे अपग्रेड करने का विकल्प नहीं है। (कोई प्रशासनिक अधिकार नहीं) – user1118047

+0

क्या आप कृपया 'पूंछ' की 'संस्करण जानकारी 'और' बॉक्स (यूनिक्स/लिनक्स) 'प्रदान कर सकते हैं जिसका आप उपयोग कर रहे हैं? –

+1

सनोस 5.10 सुनिश्चित करें कि पूंछ के संस्करण को कैसे ढूंढें ... – user1118047

3

आप inotify जरूरत है नई फ़ाइल के निर्माण का पता लगाने के कर सकते हैं, उस के लिए एक समाधान के मतदान फाइल सिस्टम रखने के लिए पृष्ठभूमि पर पूंछ चलाते समय होगा:

#!/bin/bash 

get_latest() { 
    local files=(*.log) 
    local latest=${files[${#files[@]}-1]} 
    echo "$latest" 
    [[ $latest == $1 ]] 
} 
run_tail() { 
    tail -c +0 -f "$1" 
} 

while true; do 
    while current=$(get_latest "$current"); do 
     sleep 1 
    done 
    [[ $pid ]] && kill $pid 
    run_tail "$current" & pid=$! 
done 

(अपरीक्षित, unnecesarily hacky और अपने पुराने प्रणाली की सीमाओं के साथ सावधान रहना!)

+1

मुझे यह पसंद है कि यह जवाब कहां जा रहा है ... मैं इस दाहिने स्क्रिप्ट में प्लग-एंड-प्ले करने में सक्षम नहीं था और यह वही करो जो मैं चाहता हूं, लेकिन मैं यहां कोड के साथ खेलना चाहता हूं और देख सकता हूं कि मैं इसे काम करने के लिए क्या कर सकता हूं। – user1118047

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