Cách cắt bớt tệp được sử dụng để chuyển hướng thiết bị xuất chuẩn


4

Tôi đang cố gắng cắt bớt một tập tin, được sử dụng cho thiết bị xuất chuẩn chuyển hướng. Ví dụ:

ping localhost>/tmp/test.log

Nếu tôi gọi rm /tmp/test.logthì chuyển hướng dừng lại nhưng lệnh hoạt động.

Nếu tôi gọi truncate -s0 /tmp/test.loghoặc >/tmp/test.loghoặc echo ..vv, chuyển hướng hoạt động nhưng tệp chứa các số 0 đứng đầu vì vị trí luồng không thay đổi.

Làm thế nào tôi có thể cắt ngắn tập tin?


1
Lưu ý rm /tmp/test.logloại bỏ mục nhập tệp khỏi thư mục nhưng bản thân tệp vẫn tồn tại, chiếm không gian và phát triển trong hệ thống tệp dựa trên inode. Nó sẽ thực sự bị xóa khi không sử dụng nữa, tức là khi bạn pingbị chấm dứt hoặc thậm chí là muộn hơn.
Kamil Maciorowski

Chỉ cần thực hiện cắt ngắn một phần của thủ tục của bạn. Gửi 10.000 ping hoặc bất cứ điều gì, xóa các tập tin và viết một cái mới.
Seth

Ý anh là gì; bạn muốn điều gì xảy ra Bạn có muốn lặp đi lặp lại pingcủa bạn localhost, và giữ cập nhật /tmp/test.log, do đó nó chỉ chứa các số liệu thống kê sản lượng từ phản ứng gần đây nhất ICMP?
tjt263

Câu trả lời:


2

Bạn cần hiểu hệ thống tệp Unix trước khi bạn có thể trả lời câu hỏi này.

Điều duy nhất rmlàm là xóa tên tệp , thực sự là một con trỏ từ cấu trúc thư mục của bạn đến các khối đĩa.

Khi bạn chạy

ping localhost > /tmp/test.log
rm /tmp/test.log

chuyển hướng không dừng lại. Lệnh tiếp tục chạy và dữ liệu tiếp tục tích lũy trong khu vực đĩa của bạn. Bạn chỉ đơn giản là không có quyền truy cập dữ liệu này vì bạn đã xóa tên của nó.

Bạn có thể tự do tạo một tệp khác, hoàn toàn không liên quan có tên /tmp/test.log.

Như bạn đã lưu ý, bằng cách cố gắng cắt bớt tệp, bạn thoát khỏi dữ liệu đã từng ở đó, nhưng bộ mô tả tệp nội bộ biết vị trí trong tệp mà nó trỏ đến và ghi sau khi kết thúc tệp mở rộng tệp. Do đó các số không hàng đầu.

Nếu bạn muốn "thiết lập lại" chuyển hướng, thì bạn cần phải giết pingchương trình, xóa hoặc cắt bớt /tmp/test.logtệp, sau đó khởi động lại pingchương trình.

Bạn cũng có thể sử dụng một chương trình như rotatelogs

ping localhost | rotatelogs ping.out.%Y%m%d.%H%M 600

để xoay tệp nhật ký dựa trên thời gian đã trôi qua hoặc kích thước của tệp.


"Bạn chỉ đơn giản là không có quyền truy cập dữ liệu này vì bạn đã xóa con trỏ hệ thống tệp." Nói chung điều này không đúng. Bí quyết là sử dụng /proc/<PID>/fd/0đường dẫn.
Kamil Maciorowski

0

Lên kế hoạch trước:

  1. Cắt bớt hoặc xóa tập tin, nếu nó tồn tại.
  2. Sử dụng >>thay vì >.

Bằng cách này, bạn sẽ tận dụng thực tế >>là về cơ bản là "luôn luôn tìm cách kết thúc tập tin" trong khi >duy trì một con trỏ đến vị trí được viết cuối cùng.

Sau đó, bạn có thể cắt ngắn tập tin và >>sẽ tuân theo. Xem câu trả lời này của tôi , nó điều tra hành vi chính xác mà bạn cần.

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.