การอ่านอย่างต่อเนื่องจากไปป์ที่มีชื่อ (cat หรือ tail -f)


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 ไปป์สร้าง EOF บนเอาต์พุตเมื่อได้รับ EOF บนอินพุตเท่านั้น daemon การบันทึกกำลังเปิดไฟล์เขียนลงไปและเปิดไว้เหมือนที่ทำกับไฟล์ปกติดังนั้น EOF จะไม่ถูกสร้างขึ้นบนเอาต์พุต catเพียงแค่อ่านต่อไปบล็อกเมื่อใดก็ตามที่มันหมดสิ่งที่อยู่ในท่อ

คุณสามารถลองด้วยตัวเอง:

$ mkfifo test
$ cat test

และในเทอร์มินัลอื่น:

$ cat > test
hello

จะมีเอาต์พุตในเทอร์มินัลอื่น แล้ว:

world

จะมีเอาต์พุตมากขึ้นในเทอร์มินัลอื่น หากคุณตอนนี้ Ctrl-D การป้อนข้อมูลแล้วอื่น ๆcatจะยุติเกินไป

ในกรณีนี้ความแตกต่างที่สังเกตได้ระหว่างcatและtail -fจะเป็นถ้า daemon การบันทึกถูกยกเลิกหรือเริ่มต้นใหม่: catจะหยุดอย่างถาวรเมื่อการปิดปลายการเขียนของไพพ์ปิดลง แต่tail -fจะยังคงดำเนินต่อไป (เปิดไฟล์ใหม่)


ขอโทษฉันไม่เห็นที่ "โลก" จะมาจากในตัวอย่างของคุณ :)
อเล็กซานเด Mills

จากการพิมพ์ของคุณค่ะ
Michael Homer

1
จากนั้นคุณพิมพ์worldและเห็น "โลก" ปรากฏในเทอร์มินัลอื่น
Michael Homer

2

นอกจากนี้ยังมีความแตกต่างในบัฟเฟอร์ระหว่างและcat tail -fคุณสามารถตรวจสอบสิ่งนี้:

สร้างท่อ: mkfifo pipe

เริ่มต้นการอ่านไปป์โดยใช้catในพื้นหลัง:cat pipe &

เปิด 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 ลงในไพพ์ด้วยสคริปต์ Perl ในขณะที่บัฟเฟอร์พวกเขาถึง 4kb ก่อนที่จะพิมพ์ไปยัง stdout


-2

catแสดงไฟล์ทั้งหมดเมื่อtail -fแสดงเฉพาะแถวสุดท้ายและตามมา ดังนั้นหากไฟล์มีขนาดสั้นก็จะทำงานเหมือนกัน แต่ถ้าไฟล์มีขนาดใหญ่ (100+ แถว) คุณสามารถเห็นความแตกต่างที่ชัดเจนระหว่างสองไฟล์นั้น

ข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งเหล่านั้น:

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.