Tên của quá trình ở đầu kia của một ống unix?


8

Nếu hai quá trình được kết nối bằng một đường ống,

> cmd1 | cmd2

Có cách nào cmd1để tìm ra tên (hoặc PID) của quá trình ở phía bên kia của đường ống ( cmd2) không?

Ngoài ra, ngược lại, có cách nào cmd2để có được tên / PID của cmd1không?

Tôi biết rằng isatty(3)phải kiểm tra xem đầu ra đi vào (hoặc đầu vào đến từ) một thiết bị đầu cuối, vì vậy tôi tự hỏi liệu có cách nào để tìm hiểu thêm một chút về phía bên kia không.


1
Đây sẽ là nền tảng cụ thể tốt nhất; bạn đang cố gắng để làm điều đó ở đâu?
Michael Homer

Tôi sẽ ổn với phiên bản dành riêng cho Linux.
cá mập.dp

5
Về lý thuyết, có thể có nhiều hơn một quá trình ở đầu kia của ống, nếu cmd2rẽ nhánh.
Nate Eldredge

6
Mặc dù điều này có thể là có thể, tôi thực sự nghi ngờ rằng đó là một ý tưởng tốt; Câu hỏi này có mùi giống như một vấn đề XY.
Nate Eldredge

@NateEldredge Thật vậy:cmd1 | (cmd2 & cmd3)
Barmar

Câu trả lời:


14

Bạn có thể thấy đường ống trong /proc/$PID/fd. Các mô tả là một liên kết tượng trưng cho một cái gì đó như pipe:[188528098]. Với thông tin đó, bạn có thể tìm kiếm quy trình khác:

$ lsof -n | grep -w 188528098
sleep      1565   hl    1w     FIFO    0,12     0t0  188528098 pipe
sleep      1566   hl    0r     FIFO    0,12     0t0  188528098 pipe

Hoặc, nếu bạn muốn chắc chắn (để xử lý tự động) rằng số đó là ổ cắm và không phải là một phần của tên tệp:

$ lsof -n | awk 'NF==9 && $5=="FIFO" && $9=="pipe" && $8==188528098'

Với lsof4,88 trở lên, bạn cũng có thể sử dụng -Ehoặc +Ecờ:

Kết hợp với -p <pid>, -d <descriptor>bạn có thể lấy thông tin điểm cuối cho một mô tả cụ thể của một pid cụ thể .

$ sleep 1 | sh -c 'lsof -E -ap "$$" -d 0; exit'
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sh      27176 chazelas    0r  FIFO   0,10      0t0 2609460 pipe 27175,sleep,1w

Ở trên cho chúng ta biết rằng fd0 của shlà một ống có fd 1 sleepở đầu kia. Nếu bạn đổi -Ethành +E, bạn cũng có được thông tin đầy đủ cho fd đó sleep:

$ sleep 1 | sh -c 'lsof +E -ap "$$" -d 0; exit'
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sleep   27066 chazelas    1w  FIFO   0,10      0t0 2586272 pipe 27067,sh,0r 27068,lsof,0r
sh      27067 chazelas    0r  FIFO   0,10      0t0 2586272 pipe 27066,sleep,1w

(xem làm thế nào lsofcũng có đường ống trên stdin của nó)


6
Một người nên được chuẩn bị cho điều này để thất bại; ví dụ: nếu quy trình ở đầu bên kia đã thay đổi UID và bạn không được phép lsof.
Nate Eldredge
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.