Linux

unix 管道另一端的程序名稱?

  • November 18, 2017

如果兩個程序通過管道連接,

> cmd1 | cmd2

有什麼方法cmd1可以找出管道另一端的程序的名稱(或 PID)(cmd2)?

此外,反之亦然,有沒有辦法cmd2獲得名稱/PID cmd1

我知道isatty(3)要檢查輸出是否進入(或輸入來自)終端,所以我想知道是否有辦法更多地了解另一端。

您可以在 中看到管道/proc/$PID/fd。描述符是一個符號連結到類似的東西pipe:[188528098]。使用該資訊,您可以搜尋其他程序:

$ 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

或者,如果您想確定(用於自動處理)該數字是套接字而不是文件名的一部分:

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

對於lsof4.88 及更高版本,您還可以使用-Eor+E標誌:

結合-p <pid>, -d <descriptor>,您可以獲得給定pid的特定**描述符的端點資訊。

$ 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

上面告訴我們fd0 of是一個 fd 1 of在另一端sh的管道。sleep如果您更改-E+E,您還將獲得該 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

(看看lsof它的標準輸入上還有管道)

引用自:https://unix.stackexchange.com/questions/405485