"पूंछ" कमांड का "-f" पैरामीटर कैसे काम करता है?


59
$ tail -f testfile

वास्तविक समय में निर्दिष्ट फ़ाइल में नवीनतम प्रविष्टियों को दिखाने के लिए कमांड को माना जाता है? लेकिन ऐसा नहीं हो रहा है। कृपया मुझे सुधारें, अगर मैं इसे करने का इरादा रखता हूं तो यह गलत है ...

मैंने एक नई फ़ाइल "आ" बनाई और पाठ की एक पंक्ति को जोड़ा और इसे बंद कर दिया। तब यह आदेश (पहली पंक्ति) जारी किया:

$ tail -f aaa
xxx
xxa
axx

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

यहाँ क्या गलत है? tail -fअगर वे केवल प्रणाली द्वारा लिखा जाता है आदेश केवल नए प्रविष्टियों पता चलता है? (लॉग फाइल आदि की तरह)

जवाबों:


62

से tail(1) आदमी पेज :

   With  --follow  (-f),  tail  defaults to following the file descriptor,
   which means that even if a tail’ed file is renamed, tail will  continue
   to  track  its  end.   This  default behavior is not desirable when you
   really want to track the actual name of the file, not the file descrip-
   tor (e.g., log rotation).  Use --follow=name in that case.  That causes
   tail to track the named file  in  a  way  that  accommodates  renaming,
   removal and creation.

आपका टेक्स्ट एडिटर मूल फ़ाइल का नाम बदल रहा है या हटा रहा है और उसी फ़ाइलनाम के तहत नई फ़ाइल को सहेज रहा है। -Fइसके बजाय उपयोग करें ।


काम किया! तो, मैं सही के $ tail -F filenameबजाय हर समय कमांड का उपयोग कर सकता हूं $ tail -f filename?
its_me

17
अगर वह आपका अभीष्ट व्यवहार है। ऐसे मामले हो सकते हैं जहां आप फ़ाइल नाम के बजाय डिस्क्रिप्टर द्वारा अनुसरण करना चाहते हैं, लेकिन निष्पक्ष होने के लिए मैं उनमें से कई में नहीं आया हूं।
इग्नासियो वाज़केज़-अब्राम्स

lsofयह हो रहा है दिखा सकते हैं - उदाहरण के lsof -Fpcftniलिए दिखाएगा कि इसके बाद होने वाले इनडायरेक्टर tailमें वही नहीं है जो संपादक ने खोला है।
आरोन डी। मरास्को

10

फ़ाइल के लिए आपके संपादक का अपना बफर है। जब आप संपादक में पाठ को संशोधित करते हैं, तो फ़ाइल में कुछ भी नहीं लिखा जाता है।

जब आप अपने परिवर्तनों को सहेजते हैं, तो संभावना है कि संपादक पुरानी फ़ाइल को हटा देता है और एक नया बनाता है। tail -fअभी भी हटाए गए फ़ाइल से जुड़ा होगा, इसलिए यह कुछ भी नया नहीं दिखाएगा।


1
संपादक फ़ाइल को अधिलेखित करता है, लॉग पाठ को जोड़ते हैं। शायद यही समस्या हो।
रुफो एल मगूफो

@ जुआन: मुझे आपकी टिप्पणी समझ में नहीं आती। मेरे उत्तर में वर्णित "को छोड़कर" के बारे में कोई ठोस अर्थ नहीं है।
स्टीफन जिमेनेज़

हां, मेरा वही मतलब था कि आप :)
रुफो एल मगूफो

3

tail डिफ़ॉल्ट रूप से प्रत्येक 1 सेकंड को "रिफ्रेश" करें, रियलटाइम नहीं।

इसके साथ प्रयास करें (आपको bash4 की आवश्यकता है):

  • 2 टर्मिनल खोलें।
  • पहले टर्मिनल में निष्पादित touch ~/output.txtऔर tail -f ~/output.txt
  • दूसरे टर्मिनल में निष्पादित for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • पहले टर्मिनल में पूंछ के उत्पादन को देखें।

क्या आपका मतलब था echo $i >> ~/output.txt? साथ ही, यह उत्तर प्रश्न के बिंदु को याद करता है।
इग्नासियो वाज़क्वेज़-अब्राम्स

1
हां, आपने टिप्पणी लिखते समय मैंने असफलता को सही किया :)। मेरा जवाब केवल समस्या के लिए एक परीक्षा है । टेल-ऑफ़ कमांड केवल नई प्रविष्टियाँ दिखाता है यदि वे केवल सिस्टम द्वारा लिखे गए हैं?
रुफो एल मगूफो

4
@ जुआन: आजकल, linux पर, tailfएक inotify based कार्यान्वयन है। तो यह realtime में ताज़ा होगा।
स्टेफेन जिमेनेज

हाँ tailf, लेकिन tailinotify का उपयोग करता है ?. मुझे नहीं पता था tailf। पूंछ के मैनपेज के लिए 1 सेकंड का डिफ़ॉल्ट दिखा -s
रूफो एल मगूफो

3
हां, tailइसका अनुसरण किया गया और अब उपलब्ध होने पर भी इनोटिफाई का उपयोग किया जा रहा है। tailfफ़ाइल पर कोई गतिविधि नहीं होने पर, केवल सो रहा है, मतदान नहीं कर रहा है। tail -fकुछ गतिविधि दिखाता है ( straceआउटपुट देखें )।
स्टीफन जिमेनेज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.