Thực hiện một strace
số tail -f
, nó giải thích tất cả mọi thứ. Phần thú vị:
13791 fstat(3, {st_mode=S_IFREG|0644, st_size=139, ...}) = 0
13791 fstatfs(3, {...}) = 0
13791 inotify_init() = 4
13791 inotify_add_watch(4, "/path/to/file", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1
13791 fstat(3, {st_mode=S_IFREG|0644, st_size=139, ...}) = 0
13791 read(4, 0xd981c0, 26) = -1 EINTR (Interrupted system call)
Những gì nó làm? Nó thiết lập một inotify
trình xử lý cho tệp, và sau đó đợi cho đến khi có điều gì đó xảy ra với tệp này. Nếu kernel nói tail
thông qua trình xử lý inotify này, rằng tệp đã thay đổi (thông thường, đã được nối thêm), thì tail
1) tìm 2) đọc các thay đổi 3) ghi chúng ra màn hình.
/proc/3844/fd/1
trên hệ thống của bạn là một liên kết tượng trưng đến /dev/pts/14
, đó là một thiết bị nhân vật. Không có thứ gì giống như "bản đồ bộ nhớ", có thể được truy cập bằng thứ đó. Do đó, không có gì mà những thay đổi của chúng có thể được ký vào inotify, bởi vì không có vùng đĩa hoặc vùng nhớ nào có thể được truy cập bởi điều đó.
Thiết bị nhân vật này là một thiết bị đầu cuối ảo, thực tế hoạt động như thể nó là một ổ cắm mạng. Các chương trình chạy trên thiết bị đầu cuối ảo này đang kết nối với thiết bị này (giống như khi bạn telnet-ted vào cổng tcp) và viết những gì chúng muốn viết vào. Cũng có những thứ phức tạp hơn, ví dụ như khóa màn hình, các chuỗi điều khiển đầu cuối và như vậy, những thứ này thường được xử lý bằng ioctl()
các cuộc gọi.
Tôi nghĩ rằng, bạn muốn bằng cách nào đó xem một thiết bị đầu cuối ảo. Nó có thể được thực hiện trên linux, nhưng nó không đơn giản như vậy, nó cần một số chức năng giống như proxy mạng và một chút sử dụng khéo léo của các ioctl()
cuộc gọi này . Nhưng có những công cụ có thể làm điều đó.
Hiện tại tôi không thể nhớ, gói debian nào có công cụ cho mục tiêu này, nhưng với một chút googling bạn có thể tìm thấy nó có thể dễ dàng.
Tiện ích mở rộng: như @Jajesh đã đề cập ở đây (cho anh ta +1 nếu bạn cho tôi), công cụ được đặt tên watch
.
Phần mở rộng số 2: @kelnos đã đề cập, một đơn giản cat /dev/pts/14
cũng là đủ. Tôi đã thử điều đó, và vâng, nó hoạt động, nhưng không chính xác. Tôi không thử nghiệm rất nhiều với điều đó, nhưng có vẻ như với tôi như thể một đầu ra đi vào thiết bị đầu cuối ảo đi hoặc đến cat
lệnh, hoặc đến vị trí ban đầu của nó, và không bao giờ để cả hai. Nhưng nó không chắc chắn.