Tìm quá trình ở đầu kia của ống


34

Tôi đang cố gắng theo dõi một số hành vi kỳ quặc của một vài quy trình và chạy đến một điểm tôi không chắc chắn làm thế nào để theo dõi quá khứ. Quá trình treo, mà tôi gắn liền với việc sử dụng strace -pđã cho thấy điều này:

Process 7926 attached - interrupt to quit
read(3, 

Được rồi, vì vậy nó đang chờ đầu vào trên fd 3, vì vậy tôi đã đi kiểm tra xem nó là gì:

$ ls -l /proc/7926/fd/3
lr-x------ 1 user grp 64 Mar 15 10:41 /proc/7926/fd/3 -> pipe:[20043922]

Được rồi, vậy đó là một đường ống ... bây giờ là câu hỏi - ai là tác giả của đường ống này? Tôi nhớ rằng trên Linux có một tính năng đặc biệt cho các socket miền unix nơi bạn có thể yêu cầu đường dẫn tệp bắt đầu bằng byte NUL để truy cập vào "không gian tên ổ cắm trừu tượng" (được đề cập ở đây: http://tkhanson.net/cgit.cgi /misc.git/plain/unixdomain/Unix_domain_sockets.html ). Tôi không chắc có thứ gì tương tự cho các đường ống mà tôi có thể tận dụng hay không, nhưng tôi không tìm thấy gì.

Tôi đã hy vọng một công cụ như fuserhoặc lsofcó thể giúp đỡ, nhưng tôi chưa đi đến đâu.

Có ý kiến ​​gì không?

Câu trả lời:


32

Nội dung symlink "pipe: [20043922]" là một ID duy nhất; đầu kia của ống sẽ có ID trùng khớp.

(find /proc -type l | xargs ls -l | fgrep 'pipe:[20043922]') 2>/dev/null

sẽ cho bạn thấy cả hai đầu của đường ống.


1
Suy nghĩ tốt, cảm ơn! Trong khi điều tra, tôi cũng đã bắt gặp chủ đề này ở đây serverfault.com/questions/48330/ Khăn vì vậy tôi nghĩ rằng tôi cũng sẽ bỏ liên kết ở đây chỉ là ffr cho những người khác.
FatalError

2

Bạn có thể lấy danh sách các quy trình bằng cách sử dụng đường ống bằng cách sử dụng lsoflệnh:

lsof | grep 'FIFO.*20043922'

Đầu ra sẽ hiển thị các trình đọc (trong cột FD với các mục như 1r) và các nhà văn (cùng các cột với các mục như 2w).

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.