พารามิเตอร์“ -f” ของคำสั่ง“ tail” ทำงานอย่างไร


59
$ tail -f testfile

คำสั่งควรจะแสดงรายการล่าสุดในไฟล์ที่ระบุในเวลาจริงใช่มั้ย แต่นั่นไม่ได้เกิดขึ้น โปรดแก้ไขฉันด้วยถ้าสิ่งที่ฉันตั้งใจจะทำคือผิด ...

ฉันสร้างไฟล์ใหม่ "aaa" และเพิ่มบรรทัดข้อความแล้วปิดมัน จากนั้นออกคำสั่งนี้ (บรรทัดแรก):

$ tail -f aaa
xxx
xxa
axx

สามบรรทัดสุดท้ายคือเนื้อหาของไฟล์ aaa ตอนนี้คำสั่งยังคงทำงานอยู่ (ตั้งแต่ฉันใช้-f) ฉันเปิดไฟล์ aaa ผ่าน 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
ถ้านั่นเป็นพฤติกรรมที่คุณตั้งใจไว้ มีอาจจะเป็นกรณีที่คุณต้องการที่จะปฏิบัติตามโดยบ่งแทนชื่อไฟล์ แต่เพื่อความเป็นธรรมผมไม่ได้เจอหลายคน
Ignacio Vazquez-Abrams

lsofสามารถแสดงสิ่งนี้ได้ - ตัวอย่างเช่นlsof -Fpcftniจะแสดงให้เห็นว่า inode ที่ตามมาtailนั้นไม่เหมือนกับสิ่งที่ editor เปิดไว้อีกต่อไป
Aaron D. Marasco

10

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

เมื่อคุณบันทึกการเปลี่ยนแปลงโอกาสที่ผู้แก้ไขจะลบไฟล์เก่าและสร้างใหม่ tail -fจะยังคงเชื่อมต่อกับไฟล์ที่ถูกลบดังนั้นมันจะไม่แสดงอะไรใหม่


1
เอดิเตอร์เขียนทับไฟล์บันทึกจะต่อท้ายข้อความ นี่อาจเป็นปัญหา
Rufo El Magufo

@ Juan: ฉันไม่เข้าใจความคิดเห็นของคุณ "overwrite" ไม่มีความหมายที่เป็นรูปธรรมยกเว้นสิ่งที่ฉันอธิบายไว้ในคำตอบ
Stéphane Gimenez

ใช่ฉันทำอย่างเดียวกันกับคุณ :)
Rufo El Magufo

3

tail "รีเฟรช" ทุก ๆ 1 วินาทีโดยค่าเริ่มต้นไม่ใช่เรียลไทม์

ลองกับสิ่งนี้ (คุณต้อง bash4):

  • เปิดเทอร์มินัล 2 เครื่อง
  • ในสถานีแรกที่ดำเนินการและtouch ~/output.txttail -f ~/output.txt
  • ในสถานีที่สองดำเนินการ for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • ดูที่เอาต์พุตของ tail ในเทอร์มินัลแรก

คุณหมายถึงecho $i >> ~/output.txtอะไร นอกจากนี้คำตอบนี้ยังขาดจุดของคำถาม
Ignacio Vazquez-Abrams

1
ใช่ฉันแก้ไขข้อผิดพลาดขณะที่คุณเขียนความคิดเห็น :) คำตอบของฉันเป็นเพียงการทดสอบสำหรับปัญหาคำสั่ง tail -f แสดงเฉพาะรายการใหม่หากพวกเขาเขียนโดยระบบเท่านั้น?
Rufo El Magufo

4
@ จวน: ทุกวันนี้บน linux tailfมีการใช้งานแบบ inotify ดังนั้นมันจะรีเฟรชแบบเรียลไทม์
Stéphane Gimenez

ใช่สำหรับtailfแต่tailใช้ inotify? tailfผมไม่ทราบว่า manpage หางแสดงเริ่มต้นของ 1 -sวินาทีสำหรับ
Rufo El Magufo

3
ใช่tailติดตามและตอนนี้ใช้ inotify ด้วยเช่นกันเมื่อพร้อมใช้งาน tailfไม่ได้ลงคะแนนเลยเพียงแค่หลับเมื่อไม่มีกิจกรรมใด ๆ ในไฟล์ tail -fแสดงกิจกรรมบางอย่าง (ดูstraceผลลัพธ์)
Stéphane Gimenez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.