2012-09-17 27 views
11

Tôi có 30 phiên bản của một quá trình đang chạy trên máy chủ và muốn ghi tệp đang mở cho từng quy trình để phân tích.lsof nên cung cấp cho tất cả các tệp đang mở cho một tập hợp các pids

Tôi chạy lệnh sau:

* ps auwwx | grep PROG_NAME | awk '{print $2}' | xargs lsof -p | less 

Nó phàn nàn rằng, "lsof: lỗi tình trạng trên: Không có tập tin hoặc thư mục"

Tuy nhiên, nếu tôi chạy lsof -p <pid> nó mang lại cho tôi sự danh sách các tệp đang mở cho quá trình đó. Làm thế nào tôi có thể nhận được một danh sách tất cả các tập tin mở cho tất cả 30 trường hợp của quá trình trên một máy FreeBSD.

Hơn nữa, tôi không muốn các thư viện được chia sẻ được liệt kê. Nếu tôi làm -d "^txt", nó không hiển thị một số tệp db khác mà tôi muốn được hiển thị. Có cách nào khác để grep ra các tập tin .so?

+0

FYI cho người qua đường Internet: Tôi muốn giải quyết một vấn đề tương tự - đếm số lượng các tập tin đang mở cho mỗi quá trình, cụ thể là Java. Tôi đã làm nó như thế này: 'pgrep java | xargs -I {} bash -c 'printf {}; lsof -p {} | wc -l'' –

Trả lời

14

Tùy chọn lsof -p có danh sách PID được phân cách bằng dấu phẩy. Cách bạn đang sử dụng xargs sẽ chuyển các pids dưới dạng các đối số riêng lẻ, dẫn đến một số đối số được hiểu là tên tệp.

Hãy thử lsof -p $(your grep | tr '\012' ,) Điều đó sẽ có dấu phẩy, tôi không chắc chắn nếu lsof sẽ quan tâm nhưng bạn có thể sed tắt nếu cần.

5

Bạn có thể sử dụng xargs -L1 lsof -p để chạy lsof một lần mỗi pid.

Thậm chí tốt hơn: sử dụng lsof -c để liệt kê tất cả các file mở cửa từ lệnh phù hợp với một mô hình cụ thể:

lsof -c bas # list all processes with commands starting with 'bas' 
lsof -c '/ash$/x' # list all commands ending with 'ash' (regexp syntax) 
Các vấn đề liên quan