नामित पाइप (बिल्ली या पूंछ-एफ) से निरंतर पढ़ना


16

मैंने rsyslogकुछ लॉग ईवेंट लॉग करने के लिए कॉन्फ़िगर किया है /dev/xconsole:

*.*;cron.!=info;mail.!=info      |/dev/xconsole

/dev/xconsoleएक नामित पाइप ( fifo) है। अगर मैं देखना चाहता हूं कि क्या लॉग किया जा रहा है, तो मैं कर सकता हूं cat /dev/xconsole। मुझे यह देखकर आश्चर्य हुआ, कि कमांड cat /dev/xconsoleफ़ाइल को पढ़ने के बाद समाप्त नहीं होती है, बल्कि इसके विपरीत कार्य करती है tail -f। दूसरे शब्दों में, दो आज्ञाएँ समान व्यवहार करती हैं:

cat /dev/xconsole
tail -f /dev/xconsole

क्या कोई समझा सकता है कि ऐसा क्यों है?

क्या दोनों में कोई अंतर है?

जवाबों:


18

catयह EOF होने तक पढ़ता रहता है। एक पाइप आउटपुट पर ईओएफ का उत्पादन केवल तभी करता है जब उसे इनपुट पर ईओएफ मिलता है। लॉगिंग डेमॉन फ़ाइल को खोल रहा है, इसे लिख रहा है, और इसे खुला रख रहा है - जैसे यह एक नियमित फ़ाइल के लिए करता है - इसलिए ईओएफ आउटपुट पर कभी भी उत्पन्न नहीं होता है। catबस पढ़ना जारी रखता है, जब भी यह निकास होता है कि पाइप में वर्तमान में क्या है।

आप स्वयं इसे आज़मा सकते हैं:

$ mkfifo test
$ cat test

और दूसरे टर्मिनल में:

$ cat > test
hello

दूसरे टर्मिनल में आउटपुट होगा। फिर:

world

अन्य टर्मिनल में अधिक उत्पादन होगा । यदि आप अब Ctrl-D इनपुट करते हैं तो दूसरा catभी समाप्त हो जाएगा।

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


क्षमा करें, मैं नहीं देखता कि आपके उदाहरण में "दुनिया" कहाँ से आएगी :)
अलेक्जेंडर मिल्स

इसे अपने टाइपिंग से।
माइकल होमर

1
और फिर आप टाइप करते हैं world, और, लो, "वर्ल्ड" दूसरे टर्मिनल में दिखाई देता है।
माइकल होमर

2

और बीच में बफरिंग में भी अंतर है । आप इसे देख सकते हैं:cattail -f

पाइप बनाएं: mkfifo pipe

catपृष्ठभूमि का उपयोग करके पाइप पढ़ना शुरू करें :cat pipe &

पाइप खोलें और इसे हर सेकंड लिखें: perl -MFcntl -we 'sysopen(my $fh, "pipe", O_WRONLY | O_NONBLOCK); while() {warn "written: " . syswrite($fh, "hello\n"); sleep 1}'

अब tail -f pipe &इसके बजाय इसके साथ प्रयास करें cat। तो आप देख सकते हैं कि catप्रिंट लाइनों को जैसे ही पर्ल लिपि द्वारा पाइप पर लिखा जाता है, जबकि tail -f स्टडआउट करने से पहले बफ़र उन्हें 4kb तक बढ़ा देता है।


-2

catजब आप tail -fकेवल अंतिम पंक्तियों और अनुसरण को दिखाता है, तो आपको पूरी फ़ाइल दिखाता है। इसलिए यदि फ़ाइल कम है तो वे समान व्यवहार करते हैं, लेकिन यदि फ़ाइल बड़ी (100+ पंक्तियाँ) है तो आप उन दोनों के बीच स्पष्ट अंतर देख सकते हैं।

उन आदेशों के बारे में अतिरिक्त जानकारी:

tail http://www.computerhope.com/unix/utail.htm

cat http://www.computerhope.com/unix/ucat.htm

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