Có thể để cuộn cuộn vào một liên kết tượng trưng đến một tệp mới mà không ảnh hưởng đến bất kỳ xử lý tệp đang mở nào không?


7

Một ứng dụng tôi đang phát triển nhật ký cục bộ sẽ xuất ra các tệp được định dạng bằng dấu thời gian hiện tại, chẳng hạn như app-%Y%m%d.log.

Để đơn giản hóa để có thể điều chỉnh nhật ký ngày hiện tại trong cửa sổ đầu cuối, tôi có một liên kết tượng trưng có tên current.logtrỏ đến nhật ký ngày hôm nay.

Khi bắt đầu công việc mỗi ngày, tôi cần phải giết tiến trình đuôi, trỏ liên kết tượng trưng vào tệp hôm nay và sau đó chạy lại lệnh tới tail -f current.log.

Có thể thay đổi mục tiêu của symlink mà không phải khởi động lại tail- bằng cách thay đổi mục tiêu của phần xử lý tệp mà không tailkhôn ngoan hơn?

Để tự động hóa tác vụ "bắt đầu ngày làm việc mới" này, thật dễ dàng để thiết lập một tập lệnh cron'ed để trỏ liên kết tượng trưng vào tệp ngày nay, nhưng dường như tailquy trình hiện tại sẽ không biết rằng mục tiêu đã thay đổi.


Sự trừu tượng hóa hệ điều hành mà bạn gọi là "tay cầm" được gọi tốt hơn là "mô tả tệp". Thật khó để nói, với tình trạng tài liệu của Microsoft, nhưng "mô tả" và "xử lý" có thể khác nhau ở một mức độ nào đó.
Bruce Ediger

1
Một cách để giải quyết vấn đề này là đăng nhập thêm vào fifo và sau đó xconsoletừ fifo.
Jodie C

Câu trả lời:


7

Tôi không nghĩ điều đó là có thể, trừ khi bạn có thể có đuôi để đóng và mở lại tệp theo định kỳ. Một đuôi (hoặc bất kỳ chương trình nào khác) mở một tệp, nó sẽ xử lý nút inode của tệp đó. Tại thời điểm đó, tên tệp và liên kết không còn được tham khảo. Đó là lý do tại sao bạn có thể xóa một tệp khỏi hệ thống tệp và bất kỳ chương trình nào mở tệp đó sẽ tiếp tục hoạt động. Nó chỉ là khi chương trình; ast đóng tệp mà nó thực sự bị xóa khỏi đĩa.

Cập nhật: Ít nhất đuôi phiên bản trên OS X có tùy chọn -F, sẽ mở lại tệp nếu nó đã di chuyển.


1
Ubuntu cũng có -F (hoặc --follow = current.log --retry)
charlesbridge

2
tail -Fcũng hoạt động tốt ở Fedora; gợi ý về OS X đã cho tôi đủ gợi ý để kiểm tra nó trên hệ thống của tôi. Đây là câu trả lời tốt nhất để đạt được những gì tôi muốn làm (tiếp tục theo dõi một tập tin ngay cả khi nó thay đổi tên); có vẻ khá rõ ràng câu trả lời cho câu hỏi gốc của tôi về symlink là "không". Cảm ơn!
matt b

đuôi -F hoạt động với tôi trong Ubuntu.
frankadelic

2

Nếu bạn đang sử dụng linux hiện đại, bạn có thể sử dụng inotifywait, một trong những chương trình dòng lệnh từ gói công cụ inotify . Tôi đã không làm điều này, nhưng có vẻ như inotifywaitcó thể được sử dụng trong tập lệnh shell để đặt lại liên kết tượng trưng và dừng và khởi động lại tail -ftrên liên kết tượng trưng. Bạn thậm chí có thể loại bỏ liên kết tượng trưng và chỉ cần theo đuôi tệp nhật ký hiện tại.

Không sử dụng inotify, có thể viết chương trình giống đuôi của bạn để kiểm tra xem số inode của tên tệp mà nó đọc có thay đổi hay không. Tại thời điểm đó, chương trình giống như đuôi có thể đóng bộ mô tả tệp cũ và lấy một bộ mô tả tệp mới cho tên tệp bây giờ khác. Đây là một chương trình khó để viết và nó dễ bị điều kiện đua.


1

Từ mô tả của bạn, có vẻ như hoàn cảnh cụ thể của bạn có thể được giải quyết bằng cách thực hiện một công việc định kỳ cũng giết / khởi động lại quá trình đuôi. Nhưng nói chung, đuôi (Mac OS là ngoại lệ) sẽ ghi nhớ vị trí của bạn trong tệp (nghĩa là phần bù byte). Ngoài ra, tệp mở xử lý trỏ đến tệp đích chứ không phải symlink. Symlink trở nên không liên quan đến quá trình đọc khi tệp đã được mở. Mặc dù có thể có các tính năng mở lại tệp dựa trên đường dẫn ban đầu khi có gì đó thay đổi, hầu hết các triển khai không làm điều này.


1

Tại sao không đăng nhập vào một tệp, current.log mà bạn có thể nối đuôi nội dung trái tim của bạn và sau đó sử dụng cái gì đó như / usr / sbin / logrotate để xoay tệp đó. Bạn có thể chỉ định trong cấu hình mà bạn muốn thực hiện một số lệnh postrotate để đổi tên tệp cũ với ngày được nối, v.v ... Nó loại bỏ hoàn toàn nhu cầu về liên kết tượng trưng và cũng có thể đơn giản hóa mã đăng nhập của bạn.

Tất nhiên, logrotate có thể không được cài đặt trên hệ thống bạn đang phát triển.


1

Khi một chương trình đã mở tệp, nó sẽ tiếp tục truy cập cùng một tệp đó, ngay cả khi tệp được di chuyển hoặc thậm chí bị xóa. (Xóa một tệp đang mở chỉ xóa tên của nó; tệp - inode - thực sự bị xóa một khi không có quá trình nào được mở.)

Một số chương trình xem nếu có gì đó xảy ra với tệp mà họ đã mở. Ví dụ, chương trình cổ điển tail -fgiữ các dòng in được nối vào cùng một tệp; một số triển khai hiện đại (GNU, FreeBSD, NetBSD, OSX) có tail -F, phát hiện nếu một tệp mới có cùng tên được di chuyển vào vị trí và bắt đầu đọc từ tệp mới. Đa nhiệm cũng có thể làm điều đó (chạy nó như multitail --retry).

Bạn có thể sử dụng giao diện Inotify trên Linux hoặc tương đương với các thông báo khác để phát hiện xem một tệp có bị thay đổi hay không. Trên Linux, sử dụng inotifywaitlệnh .


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.