Loại bỏ tin nhắn 'cắt ngắn' tệp khi sử dụng đuôi


11

Tôi đang theo dõi một tệp nhật ký bằng cách sử dụng tail -f messages.logvà đây là một phần của đầu ra:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Fusce eget tellus sit amet odio porttitor rhoncus. 
Donec consequat diam sit amet tellus viverra pellentesque. 
tail: messages.log: file truncated
Suspendisse at risus id neque pharetra finibus in facilisis ipsum.

Nó hiển thị tail: messages.log: file truncatedkhi tệp bị cắt tự động và điều đó sẽ xảy ra, nhưng tôi chỉ muốn tailhiển thị cho tôi đầu ra mà không có thông báo cắt ngắn này.

Tôi đã thử sử dụng tail -f messages.log | grep -v truncatednhưng nó vẫn hiển thị cho tôi tin nhắn.

Có phương pháp nào để chặn thông điệp này không?

Câu trả lời:


15

Thông báo đó là đầu ra trên thiết bị lỗi chuẩn như tất cả các thông báo lỗi và cảnh báo.

Bạn có thể bỏ tất cả đầu ra lỗi:

tail -f file 2> /dev/null

Hoặc để chỉ lọc các thông báo lỗi có chứa truncate:

{ tail -f file 2>&1 >&3 3>&- | grep -v truncated >&2 3>&-;} 3>&1

Điều đó có nghĩa là tuy nhiên bạn mất trạng thái thoát tail. Một vài shell có pipefailtùy chọn (được bật với set -o pipefail) cho đường ống đó để báo cáo trạng thái thoát tailnếu nó không thành công. zshbashcũng có thể báo cáo trạng thái của các thành phần riêng lẻ của đường ống trong $pipestatus/ $PIPESTATUSmảng của chúng.

Với zshhoặc bash, bạn có thể sử dụng:

tail -f file 2> >(grep -v truncated >&2)

Nhưng hãy cẩn thận rằng greplệnh không được chờ, vì vậy các thông báo lỗi nếu có thể cuối cùng sẽ được hiển thị sau khi tailthoát và trình bao đã bắt đầu chạy lệnh tiếp theo trong tập lệnh.

Trong zsh, bạn có thể giải quyết điều đó bằng cách viết nó:

{ tail -f file; } 2> >(grep -v truncated >&2)

Điều đó được thảo luận trong zshtài liệu tại info zsh 'Process Substitution':

Có một vấn đề bổ sung với >(PROCESS); khi điều này được gắn vào một lệnh bên ngoài, shell cha không chờ PROCESS kết thúc và do đó một lệnh ngay sau đó không thể dựa vào kết quả được hoàn thành. Vấn đề và giải pháp giống như được mô tả trong phần MULTIOS trong ghi chú Redirection :: . Do đó trong một phiên bản đơn giản hóa của ví dụ trên:

paste <(cut -f1 FILE1) <(cut -f3 FILE2) > >(PROCESS)

(lưu ý rằng không có MULTIOS nào được tham gia), PROCESS sẽ được chạy không đồng bộ khi có liên quan đến shell cha. Cách giải quyết là:

{ paste <(cut -f1 FILE1) <(cut -f3 FILE2) } > >(PROCESS)

Các quy trình bổ sung ở đây được sinh ra từ vỏ cha mẹ sẽ chờ hoàn thành.


Có một lý do bạn thích một subshell ( )hơn một lệnh phức tạp { }?
Tom Hale

@TomHale. Không có lý do chính đáng. Xem chỉnh sửa. Cảm ơn.
Stéphane Chazelas

2

Nếu grepkhông thoát khỏi đầu ra, rất có thể nó đã được in trên lỗi tiêu chuẩn. Cách đơn giản nhất để thoát khỏi điều đó là chỉ cần bỏ nó:

tail -f messages.log 2>/dev/null

1
Có lừa không, mà còn đàn áp những tin nhắn khác.
Bas Peeters

Đúng, @ StéphaneChazelas có một giải pháp phức tạp hơn nhưng chỉ bỏ qua thông điệp liên quan.
l0b0

1

Có thể giúp đỡ nếu có thể được sửa chữa nguồn gốc của lỗi này. Nó đã xảy ra bởi vì một cái gì đó ghi vào tập tin với ghi đè ">" không có thêm ">>".

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.