อะไรคือความแตกต่างระหว่าง "tail -f" และ "tail -F"?


41

ฉันไม่เคยใช้tail -Fคำสั่งแทนใช้เสมอtail -fแต่มีคนบอกฉันว่า-Fดีกว่าโดยไม่มีคำอธิบายมากมาย

ฉันค้นหาหน้าคนสำหรับคำสั่งหาง

-f output appended data as the file grows;

-F Same as --follow=name --retry

--retry Keep trying to open a file even when it is or becomes inaccessible

ง่ายต่อการเข้าใจสิ่งที่ต่ำกว่า-fทำ แต่ฉันไม่ทำตามสิ่งที่ตัวใหญ่-Fพยายามทำ ฉันขอขอบคุณบางคนที่สามารถอธิบายความแตกต่างให้ฉันได้

คำตอบ:


75

คุณอธิบายtailยูทิลิตี้GNU ความแตกต่างระหว่างการตั้งค่าสถานะทั้งสองนี้คือถ้าฉันเปิดไฟล์ล็อกไฟล์เช่นนี้:

$ tail -f /var/log/messages

... และถ้าหากสิ่งอำนวยความสะดวกในการหมุนบันทึกในเครื่องของฉันตัดสินใจที่จะหมุนไฟล์บันทึกนั้นในขณะที่ฉันกำลังดูข้อความที่กำลังเขียน ("หมุน" หมายถึงลบหรือย้ายไปยังตำแหน่งอื่น ฯลฯ ) ผลลัพธ์ที่ฉันเห็นจะ หยุด.

ถ้าฉันเปิดไฟล์tailแบบนี้:

$ tail -F /var/log/messages

... และอีกครั้งไฟล์จะถูกหมุน, การส่งออกจะยังคงไหลในคอนโซลของฉันเพราะtailจะเปิดแฟ้มเร็วที่สุดเท่าที่มันจะกลายเป็นใช้ได้อีกครั้งคือเมื่อโปรแกรม (s) เขียนเพื่อบันทึกเริ่มเขียนไปใหม่ /var/log/messages

ในระบบ BSD ฟรีไม่มี-Fตัวเลือก แต่tail -fจะทำงานเหมือนtail -Fในระบบ GNU โดยมีความแตกต่างที่คุณได้รับข้อความ

tail: file has been replaced, reopening.

ในเอาต์พุตเมื่อไฟล์ที่คุณกำลังตรวจสอบหายไปและปรากฏขึ้นอีกครั้ง


คุณสามารถทดสอบสิ่งนี้ได้

ในหนึ่งเซสชั่นเปลือกทำ

$ cat >myfile

ตอนนี้จะรอให้คุณพิมพ์รายการ เพียงไปข้างหน้าและพิมพ์ซึ่งพูดพล่อยๆไม่กี่บรรทัด มันจะถูกบันทึกลงในไฟล์myfileทั้งหมด

ในเชลล์เซสชั่นอื่น (อาจอยู่ในเทอร์มินัลอื่นโดยไม่ขัดจังหวะcat ):

$ tail -f myfile

สิ่งนี้จะแสดงเนื้อหา (จุดสิ้นสุด) ของmyfileในคอนโซล หากคุณกลับไปที่เซสชันแรกของเชลล์และพิมพ์อะไรเพิ่มเติมออกผลลัพธ์นั้นจะปรากฏทันทีtailในเซสชันเชลล์ที่สอง

ตอนนี้เลิกcatได้โดยการกดCtrl+Dและลบmyfileไฟล์:

$ rm myfile

จากนั้นเรียกใช้แมวอีกครั้ง:

$ cat >myfile

... และพิมพ์บางอย่างไม่กี่บรรทัด

ด้วย GNU tailบรรทัดเหล่านี้จะไม่ปรากฏขึ้นในเซสชั่นเปลือกที่สอง (ซึ่งtail -fยังคงทำงานอยู่)

ทำซ้ำการออกกำลังกายด้วยtail -Fและสังเกตความแตกต่าง


อ้อเข้าใจแล้ว. ฉันมีไฟล์บันทึกของระบบเช่น foo.log และบางครั้งฉันเห็น foo_06242016.log พร้อมกับ foo.log ดังนั้นฉันจึงเรียกใช้ tail -f foo.log มันจะชี้ไปที่ foo_06242016.log?
DaeYoung

1
@ DaeYoung ไม่ไม่ค่อนข้าง หากคุณเรียกใช้tail -f foo.logและระบบของคุณย้ายfoo.logไปที่เช่นfoo.log.0.gzผลลัพธ์ที่คุณเห็นจะหยุด หากคุณใช้-Fในทางกลับกันคุณจะเห็นเนื้อหาของใหม่ foo.logโดยไม่มีการหยุดพักระหว่าง
Kusalananda

4
+1 ... ขอบคุณที่ไม่ จำกัด คำตอบของคุณในการนำ GNU ไปใช้ แต่ให้คนอื่นรู้ว่าอะไรจะเกิดขึ้นในสภาพแวดล้อมอื่น
TOOGAM

2
ภาพประกอบที่ดีมากกับตัวอย่าง
CVn

1
@ Kusalananda: ขอบคุณสำหรับการออกกำลังกาย ฉันสังเกตเห็นความแตกต่างและช่วยให้ฉันเข้าใจได้ดีขึ้นว่า tail-f และ tail -F ทำอะไร ขอให้มีความสุขในวันนี้!
DaeYoung

14

ง่ายขึ้นเมื่อคุณเปิดไฟล์คุณจะได้รับ inode ที่มีข้อมูลเมตาบางส่วนที่ไฟล์นั้นอยู่ในดิสก์ของคุณ จากนั้น Tail จะรับฟังการเปลี่ยนแปลงของไฟล์นั้น

หากคุณลบไฟล์และสร้างใหม่ด้วยชื่อเดียวกันชื่อไฟล์จะเหมือนกัน แต่เป็น inode ที่แตกต่างกัน (และอาจเก็บไว้ในที่อื่นบนดิสก์ของคุณ) tail -fเติมไม่ลองใหม่และโหลด inode ใหม่tail -Fจะตรวจจับสิ่งนี้

ผลเช่นเดียวกันจะเกิดขึ้นหากคุณเปลี่ยนชื่อ / ย้ายไฟล์ หากคุณตัวอย่างต่อไปนี้/var/log/messagesและ logrotate /var/log/messages.1หมุนเข้าสู่ระบบเพื่อ หาง-fจะยังคงฟัง inode messages.1เก่าที่ชี้ไปยัง ท้ายด้วย-Fจะตระหนักถึงสิ่งนี้และอ่าน inode ใหม่


ขอบคุณสำหรับคำอธิบายของคุณ ตอนนี้มันสมเหตุสมผลสำหรับฉันมาก
DaeYoung

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