Làm thế nào để các thông số của đuôi đuôi của các lệnh của Viking hoạt động?


59
$ tail -f testfile

lệnh được cho là hiển thị các mục mới nhất trong tệp được chỉ định, theo thời gian thực phải không? Nhưng điều đó không xảy ra. Xin hãy sửa cho tôi, nếu những gì tôi dự định làm là sai ...

Tôi đã tạo một tập tin mới "aaa" và thêm một dòng văn bản và đóng nó. sau đó ban hành lệnh này (dòng đầu tiên):

$ tail -f aaa
xxx
xxa
axx

ba dòng cuối cùng là nội dung của tệp aaa. Bây giờ lệnh vẫn đang chạy (kể từ khi tôi sử dụng -f), tôi đã mở tệp aaa thông qua GUI và bắt đầu thêm một vài dòng thủ công. Nhưng thiết bị đầu cuối không hiển thị các dòng mới được thêm vào trong tệp.

Có chuyện gì ở đây vậy? Các tail -flệnh chỉ cho thấy mục mới nếu chúng được viết bằng cách chỉ hệ thống? (như tệp nhật ký, v.v.)

Câu trả lời:


62

Từ tail(1) trang người đàn ông :

   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.

Trình chỉnh sửa văn bản của bạn đang đổi tên hoặc xóa tệp gốc và lưu tệp mới dưới cùng tên tệp. Sử dụng -Fthay thế.


đã làm việc! Vì vậy, tôi có thể sử dụng $ tail -F filenamelệnh mọi lúc thay vì $ tail -f filenamephải không?
it_me

17
Nếu đó là hành vi dự định của bạn. Có thể có trường hợp bạn muốn theo dõi bởi người mô tả thay vì tên tệp, nhưng để công bằng, tôi đã không bắt gặp nhiều trong số đó.
Ignacio Vazquez-Abrams

lsofcó thể hiển thị điều này xảy ra - ví dụ lsof -Fpcftnisẽ cho thấy rằng nút được theo dõi tailkhông còn giống với trình soạn thảo đã mở.
Aaron D. Marasco

10

Trình chỉnh sửa của bạn có bộ đệm riêng cho tệp. Khi bạn sửa đổi văn bản trong trình chỉnh sửa, không có gì được ghi vào chính tệp đó.

Khi bạn lưu các thay đổi của mình, rất có thể trình soạn thảo chỉ cần xóa tệp cũ và tạo một tệp mới. tail -fvẫn sẽ được kết nối với tập tin đã xóa, vì vậy nó sẽ không hiển thị bất cứ điều gì mới.


1
Trình chỉnh sửa ghi đè tập tin, nhật ký nối thêm văn bản. Đây có thể là vấn đề.
Rufo El Magufo

@Juan: Tôi không hiểu bình luận của bạn. "ghi đè" không có ý nghĩa cụ thể ngoại trừ câu tôi mô tả trong câu trả lời của tôi.
Stéphane Gimenez

Vâng, tôi cũng có ý tương tự như bạn :)
Rufo El Magufo

3

tail "Làm mới" mỗi 1 giây theo mặc định, không phải thời gian thực.

Hãy thử với điều này (bạn cần bash4):

  • Mở 2 thiết bị đầu cuối.
  • Trong thiết bị đầu cuối thực hiện touch ~/output.txttail -f ~/output.txt.
  • Trong thiết bị đầu cuối thứ hai thực hiện for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • Nhìn vào đầu ra của đuôi trong thiết bị đầu cuối.

Ý bạn là echo $i >> ~/output.txtsao Ngoài ra, câu trả lời này bỏ lỡ điểm của câu hỏi.
Ignacio Vazquez-Abrams

1
Vâng, tôi đã sửa lỗi thất bại trong khi bạn viết bình luận :). Câu trả lời của tôi chỉ là một bài kiểm tra cho vấn đề Lệnh tail -f chỉ hiển thị các mục mới nếu chúng chỉ được viết bởi hệ thống?
Rufo El Magufo

4
@Juan: Ngày nay, trên linux, tailfcó một triển khai dựa trên inotify. Vì vậy, nó sẽ làm mới trong thời gian thực.
Stéphane Gimenez

Có cho tailf, nhưng tailsử dụng inotify?. Tôi không biết tailf. Trang chủ của đuôi hiển thị mặc định là 1 giây -s.
Rufo El Magufo

3
Có, đã làm tailtheo và hiện đang sử dụng inotify khi có sẵn. tailfkhông bỏ phiếu nào cả, chỉ ngủ, khi không có hoạt động nào trong tập tin. tail -fhiển thị một số hoạt động (xem straceđầu ra).
Stéphane Gimenez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.