Thursday, 15 September 2016

[CLI] tail -F, F hoa F***

Là *NIX user, hẳn phải biết dùng lệnh tail để theo dõi một file (thường là file log). Mỗi khi có dòng mới ghi vào file, ta sẽ thấy được dòng đó:
tail -f /var/log/syslog
(Trên Ubuntu, có thể gõ "logger FAMILUG" để ghi một dòng vào syslog).

Log ghi ra file mãi liệu có chán mà dừng lại?
Chán thì không chán, nhưng các nhà viết phần mềm sẽ không ghi hàng GB log vào 1 file rồi để nó dùng hết ổ cứng trên máy rồi làm chương trình chết vì hết ổ cứng. Từ đó khai niệm "log rotate" ra đời.
Mỗi file log cũ sẽ được đi chuyển, đổi tên mới (thường là thêm đuôi .1 .2 .3 ... vd: /var/log/syslog.1  và sau đó nếu cũ quá thì được nén lại bằng gzip cho tiết kiệm ổ cứng), chuyện này thường được làm hàng ngày hay hàng tuần. File log mới được tạo ra, cùng tên với file log cũ, nhưng giờ trống trơn. Xem thêm chương trình logrotate để biết thêm chi tiết.
Nếu ai đã thử dùng -f để theo dõi file log, rồi may mắn hơn nữa, file log đó được rotate, từ ấy trờ đi, không thấy lệnh tail output gì ra nữa. Lúc đó phải dùng F to.

Có một sự khác biệt tinh vi ở đây, khi dùng tail -F FILENAME thì tail sẽ theo dõi file này kể cả khi nó bị thay thế bởi file khác cùng tên (theo dõi bằng tên). Trong khi đó tail -f FILENAME lại theo dõi file descriptor, tức nếu file này có bị đổi tên thì lệnh tail vẫn tiếp tục theo dõi.

Vậy, nếu đang theo dõi file log, hãy dùng -F.

Trích man tail
       -f, --follow[={name|descriptor}]
              output appended data as the file grows; -f, --follow, and --follow=descriptor are equivalent

       -F     same as --follow=name --retry

       --retry
              keep trying to open a file even when it is or becomes inaccessible; useful when following  by
              name, i.e., with --follow=name

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 descriptor (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.

Tham khảo
- Ubuntu man tail
- Python logging

Hết.
HVN at PyMI dot vn
Trung thu Sài Gòn 2016.