Làm thế nào để tìm ra tập tin nào hiện đang được viết bởi một quá trình


9

Tình huống của tôi là thỉnh thoảng một quy trình cụ thể (trong trường hợp này là Thunderbird) không phản ứng với đầu vào của người dùng trong một phút hoặc lâu hơn. Tôi phát hiện ra iotoprằng trong thời gian này, nó ghi khá nhiều vào đĩa, và bây giờ tôi muốn tìm xem nó ghi tập tin nào, nhưng không may iotopchỉ cung cấp số liệu thống kê cho mỗi quy trình chứ không phải cho mỗi tệp đang mở (-descriptor).

Tôi biết rằng tôi có thể sử dụng lsofđể tìm ra các tệp mà quy trình hiện đang mở, nhưng tất nhiên Thunderbird có rất nhiều trong số chúng mở, vì vậy điều này không hữu ích. iostatchỉ hiển thị số liệu thống kê trên mỗi thiết bị.

Vấn đề chỉ xảy ra ngẫu nhiên và có thể mất khá nhiều thời gian để nó xuất hiện, vì vậy tôi hy vọng tôi không phải sải bước Thunderbird và lội qua những khúc gỗ dài để tìm ra tập tin nào có nhiều ghi nhất.


Câu trả lời:


6

Nếu bạn gắn strace vào quy trình ngay khi nó được treo (bạn có thể lấy pid và xếp hàng lệnh trước, trong một thiết bị đầu cuối dự phòng), nó sẽ hiển thị mô tả tệp của ghi chặn.

Ví dụ tầm thường:

$ mkfifo tmp
$ cat /dev/urandom > tmp &
[1] 636226
  # this will block on open until someone opens for reading

$ exec 4<tmp
  # now it should be blocked trying to write

$ strace -p 636226
Process 636226 attached - interrupt to quit
write(1, "L!\f\335\330\27\374\360\212\244c\326\0\356j\374`\310C\30Z\362W\307\365Rv\244?o\225N"..., 4096 <unfinished ...>
^C
Process 636226 detached

Cảm ơn, tôi không biết tôi có thể đính kèm bước trong khi quá trình đang chạy. Tôi sẽ thử điều này.
Philipp Wendler

1
Bạn có thể vượt qua thông tin này lsof -p $PIDđể biết vị trí của bộ mô tả tệp
Coren

1
hoặc ls -l /proc/pid/fdtrên Linux
Vô dụng

Sử dụng strace tôi thực sự có thể tìm ra chính xác những gì tôi muốn biết, vì vậy cảm ơn một lần nữa!
Philipp Wendler

2

Tôi có quyền truy cập root, tôi nghĩ công cụ tốt nhất sẽ là hệ thống con kiểm toán . Không có nhiều tài liệu về nó (nhưng nhiều hơn về logfs); bạn có thể bắt đầu với hướng dẫn này hoặc một vài ví dụ hoặc chỉ với auditctltrang man . Ở đây, nó là đủ để đảm bảo daemon được bắt đầu, sau đó chạy auditctlnhư root:

auditctl -a exit,always -F pid=1234 -F dir=/home/philipp

Điều này sẽ ghi vào nhật ký /var/log/audit/audit.logmỗi khi quá trình với pid 1234 viết ở đâu đó bên dưới /home/philipp. Chi phí khá nhỏ, nhỏ hơn rất nhiều strace.


Cảm ơn đã chỉ ra các hệ thống con kiểm toán như là một thay thế thú vị cho bước đi. Tuy nhiên, nó dường như không giúp ích gì ở đây vì nó dường như chỉ ghi nhật ký khi tệp được mở và do đó tôi không thể tìm ra số lượng được ghi vào mỗi tệp.
Philipp Wendler

@PhilippWendler À. Hừm. Hãy thử thêm -S read -S write(chưa được kiểm tra).
Gilles 'SO- ngừng trở nên xấu xa'
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.