2016-01-22 10 views
5

मेरे पास एक ऐसा प्रोग्राम है जो चलने पर * आउटपुट फ़ाइल में अपना आउटपुट लॉग करता है। मैंने कई अलग-अलग समय चलाने के लिए एक बैश स्क्रिप्ट स्थापित की है, इसलिए प्रत्येक रन एक अलग * .out फ़ाइल को लिखता है। मैंने पाया कि मैं इस तरह हाल ही में * .out फ़ाइल tail सकता है:सबसे हाल की फ़ाइल को आजमाएं

watch tail $(ls -tr *.out | tail -n1) 

समस्या हो कि संदर्भित $() केवल एक बार निष्पादित हो जाता है लगता है। तो जब पहला रन खत्म हो जाता है, watchtail उसी * .out फ़ाइल पर जारी रहता है, भले ही अब एक नई * .out फ़ाइल हो।

एक रन खत्म होने के बाद मैं अगली * .out फ़ाइल पर जाने के लिए इसे कैसे बदल सकता हूं?

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

बोनस अंक: यह बहुत अच्छा होगा अगर यह सिर्फ watch हर n सेकंड दोहराने की बजाय tail -f लिए संशोधित किया जा सकता है।

+2

एचएम..मैं वास्तव में उपयोग के मामले को समझ नहीं पा रहा हूं। क्या आप वास्तविक समय में कुछ फाइलें पढ़ना चाहते हैं? यदि हां, तो 'tail -f * .out' – pivanchy

+0

का उपयोग करना आसान है, मैं आमतौर पर @pivanchy से सहमत हूं, हालांकि यह उल्लेखनीय है कि POSIX 'पूंछ' एक समय में एक से अधिक फाइलों को संभालने की गारंटी नहीं है। – kojiro

+0

@pivanchy जो समाधान है। मुझे नहीं पता था कि यह इतना आसान था। –

उत्तर

2

मैं भी इस समस्या से निपटा और अंत में इस समाधान के लिए आया था:

watch "ls -t1 | sed q | xargs tail" 

थोड़ा बोनस के लिए hacky प्राप्त करने होंगे। tail कमांड --pid पर एक तर्क का भी समर्थन करता है जो संदर्भित पीआईडी ​​मरने के तुरंत बाद tail मर जाता है। बढ़िया है? यहाँ कुछ पैटर्न आप उपयोग कर सकते हैं:

while true; do ls -t1 | sed q | xargs lsof -F np | sed 's/.\(.*\)/\1/g' | xargs tail -f --pid 2>/dev/null ; done 

यह मूलतः सबसे मौजूदा फ़ाइल ट्रैक करता है और tail पुन: प्रारंभ होता है जब फ़ाइल लिखने की प्रक्रिया समाप्त होता है।

+0

धन्यवाद! मुझे बस इस तरह एक साधारण फ़ाइल फ़िल्टर जोड़ना पड़ा: 'ls -t1 * .out | देखें sed q | xargs पूंछ "' –

+1

@ जेफ इरविन भी संपादन को आज़माएं। यह फ़ाइल को और नहीं देख रहा है लेकिन सीधे आउटपुट (पूंछ के साथ) का पालन कर रहा है। – steffen

+1

संपादन बहुत अच्छा काम करता है! मैं सभी पाइपलाइनों को समझने की कोशिश भी नहीं कर रहा हूं। –

1

तो, मैं एक छोटे से मेरे वर्तमान जवाब नकल करेंगे: Tail the most recent file

आप अपनी समस्या को हल करने के लिए बहुत ही सरल कमांड इस्तेमाल कर सकते हैं:

tail -f *.out 

पूंछ भी एक से अधिक फ़ाइलों के साथ काम करता है और यह संभव है जैसे कि यह उपयोग करने के लिए:

tail -f file1 file2 file3 

तो, जैसा कि आप देख सकते हैं, यह बहुत शक्तिशाली और आसान उपकरण है और आप लिनक्स कमांड के साथ खेलने के लिए की जरूरत नहीं है एस

1

सभी फाइलों के साथ शुरू करने के लिए मौजूद है, और आप tail कि एक से अधिक फ़ाइलों को संभाल सकता है की एक आधुनिक कार्यान्वयन है, तो

tail -f *.out 

सबसे अच्छा समाधान होने के लिए प्रतीत होता है। लेकिन अगर आपके पास सभी फाइलें शुरू होने की ज़रूरत नहीं है, तो यह अभी भी आसान होगा यदि आपने अभी उन्हें बनाया है। *.out केवल आपके पास पहले से मौजूद फ़ाइलों तक विस्तारित होगा।

लेकिन अगर आप शुरू करने से पहले tail -f के लिए फ़ाइल नाम नहीं जानते हैं, तो आपको पूंछ के दौरान कोई नया आउटफाइल बनाए जाने पर पूंछ को फिर से शुरू करने की आवश्यकता होगी।उस मामले में, यह देखते हुए कि आप केवल एक समय में एक outfile प्रत्येक के लिए लिख रहे हैं, तो आप कर सकता है:

inotifywait -m -e create -q . | while read dir event file; do 
    kill %tail 
    tail -f "$file" & 
done 
kill %tail 

(ऊपर inotifywait, जो inotify-tools उबंटू तरह डेबियन-आधारित सिस्टम पर में शामिल है की आवश्यकता है।) यह देखता है नई बनाई गई फ़ाइलों के लिए वर्तमान निर्देशिका, पृष्ठभूमि में जो भी फाइल बनाई गई थी, पूंछ, और जब भी कोई नई फ़ाइल बनाई जाती है तो पिछली पूंछ कमांड को मार देती है।

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