Làm cách nào để theo dõi các tệp đã mở của một quy trình trong thời gian thực?


40

Tôi biết rằng tôi có thể xem các tệp đang mở của một quy trình bằng cách sử dụng lsof tại thời điểm đó trên máy Linux của mình. Tuy nhiên, một quy trình có thể mở, thay đổi và đóng tệp nhanh đến mức tôi sẽ không thể nhìn thấy tệp đó khi theo dõi bằng cách sử dụng tập lệnh shell tiêu chuẩn (ví dụ watch) như được giải thích trong "giám sát tệp quy trình mở trên linux (thời gian thực)" .

Vì vậy, tôi nghĩ rằng tôi đang tìm kiếm một cách đơn giản để kiểm tra một quy trình và xem những gì nó đã làm trong suốt thời gian qua. Sẽ thật tuyệt nếu bạn cũng có thể thấy những kết nối mạng mà nó (đã cố gắng) thực hiện và bắt đầu kiểm toán trước khi quá trình có thời gian để chạy mà không bắt đầu kiểm toán.

Lý tưởng nhất, tôi muốn làm điều này:

sh $ audit-lsof /path/to/executable
4530.848254 OPEN  read  /etc/myconfig
4530.848260 OPEN  write /var/log/mylog.log
4540.345986 OPEN  read  /home/gert/.ssh/id_rsa          <-- suspicious
4540.650345 OPEN  socket TCP ::1:34895 -> 1.2.3.4:80    |
[...]
4541.023485 CLOSE       /home/gert/.ssh/id_rsa          <-- would have missed
4541.023485 CLOSE socket TCP ::1:34895 -> 1.2.3.4:80    |   this when polling

Điều này có thể được sử dụng stracevà một số cờ để không nhìn thấy mọi cuộc gọi hệ thống?


Câu trả lời:


48

Chạy nó với

strace -e trace=open,close,read,write,connect,accept your-command-here

có lẽ sẽ là đủ

Bạn sẽ cần sử dụng -otùy chọn để đặt đầu ra của strace ở đâu đó ngoài bàn điều khiển, nếu quá trình có thể in ra thiết bị lỗi chuẩn. Nếu quá trình của bạn rẽ nhánh, bạn cũng sẽ cần -fhoặc -ff.

Ồ, và bạn cũng có thể muốn -t, vì vậy bạn có thể thấy khi các cuộc gọi xảy ra.


Lưu ý, bạn có thể cần phải điều chỉnh danh sách cuộc gọi chức năng tùy thuộc vào quá trình của bạn làm gì - tôi cần thêm getdentsví dụ, để có được mẫu tốt hơn bằng cách sử dụng ls:

$ strace -t -e trace=open,close,read,getdents,write,connect,accept ls >/dev/null
...
09:34:48 open("/etc/ld.so.cache", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open("/lib64/libselinux.so.1", O_RDONLY) = 3
09:34:48 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@V\0\0\0\0\0\0"..., 832) = 832
09:34:48 close(3)                       = 0
...
09:34:48 open("/proc/filesystems", O_RDONLY) = 3
09:34:48 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 366
09:34:48 read(3, "", 1024)              = 0
09:34:48 close(3)                       = 0
09:34:48 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
09:34:48 close(3)                       = 0
09:34:48 open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
09:34:48 getdents(3, /* 5 entries */, 32768) = 144
09:34:48 getdents(3, /* 0 entries */, 32768) = 0
09:34:48 close(3)                       = 0
09:34:48 write(1, "file-A\nfile-B\nfile-C\n", 21) = 21
09:34:48 close(1)                       = 0
09:34:48 close(2)                       = 0

1
Đó là đi đúng hướng, cảm ơn! Muốn có một đầu ra thân thiện hơn với người dùng, nhưng nó thực hiện công việc. Tôi có thể dành thời gian để viết một công cụ có giao diện giống như trên cho việc này. Tôi đã hy vọng một công cụ dựa trên ncurses hoặc 'top'-like sẽ tồn tại để kiểm tra hành động của nhị phân theo thời gian thực.
gertvdijk

Bạn muốn nó trông như thế nào? Có lẽ có thể chuyển sản lượng bước vào một cái gì đó thân thiện hơn.
Vô dụng

bạn chắc chắn muốn sử dụng -ođể đẩy đầu ra thành tập tin. Sau đó, bạn có thể chạy tail -F strace.outputtrong một thiết bị đầu cuối khác để cập nhật "trực tiếp".
peterph

4
Bạn cũng có thể đính kèm stracevào một quy trình đang chạy với -p PIDtùy chọn.
Frank Breitling

Thêm -yvào "[p] đường dẫn rint liên quan đến đối số mô tả tệp"
ricab
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.