Làm cách nào tôi có thể truy cập một tệp đang mở bị xóa trên Linux (đầu ra của tác vụ crontab đang chạy)?


7

Tôi có một công việc crontab kéo dài hàng giờ chạy với một số đầu ra mtr( traceroute) cứ sau 10 phút (sẽ diễn ra trong hơn một giờ trước khi nó được gửi lại cho tôi) và tôi muốn xem tiến độ hiện tại cho đến nay.

Trên Linux, tôi đã sử dụng lsof -n | fgrep cron( lsoftương tự như BSD fstat) và có vẻ như tôi đã tìm thấy tệp, nhưng nó được chú thích là đã bị xóa (một thông lệ tiêu chuẩn cho các tệp tạm thời sẽ bị xóa ngay sau khi mở):

COMMAND     PID       USER   FD      TYPE     DEVICE  SIZE/OFF       NODE NAME
...
cron      21742       root    5u      REG      202,0      7255      66310 /tmp/tmpfSuELzy (deleted)

Và không thể truy cập bằng tên trước của nó nữa:

# stat /tmp/tmpfSuELzy
stat: cannot stat `/tmp/tmpfSuELzy': No such file or directory

Làm thế nào để tôi truy cập một tập tin bị xóa như vậy vẫn còn mở?

Câu trả lời:


12

Tệp có thể được truy cập thông qua /prochệ thống tệp: bạn đã biết PIDFD từ lsofđầu ra.

cat /proc/21742/fd/5

Đây là các liên kết tượng trưng đến tệp ... nó vẫn hoạt động khi tệp bị xóa?
Bonsi Scott

4
@BonsiScott: Mọi tập tin trong /procđều là giả mạo. Đối với /proc/*/fd/các tệp, Khi gọi statchúng, chúng cho bạn biết đó là một liên kết tượng trưng, ​​khi bạn gọi readlinkchúng, chúng sẽ trả về bất cứ thứ gì chúng muốn (trong trường hợp này là đường dẫn tuyệt đối đến tệp đã được mở) và khi bạn gọi openreadtrên chúng , bạn có quyền truy cập vào một tập tin thực sự có nội dung. Điều tương tự cũng đúng với nhiều tập tin trong /proc. Ví dụ: hầu hết các tệp được tạo động có kích thước tệp bằng 0, nhưng chúng có nội dung.
BatchyX

1
Nhiều công cụ cũng cho phép bạn cố tình xóa các liên kết tượng trưng - ví dụ, tôi đã sử dụng ls -l --dereference-command-line /proc/1234/fd/5để kiểm tra kích thước của một tệp đang mở nhưng đã bị xóa.
Zanchey
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.