Linux
unix 管道另一端的程序名稱?
如果兩個程序通過管道連接,
> cmd1 | cmd2
有什麼方法
cmd1
可以找出管道另一端的程序的名稱(或 PID)(cmd2
)?此外,反之亦然,有沒有辦法
cmd2
獲得名稱/PIDcmd1
?我知道
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'
對於
lsof
4.88 及更高版本,您還可以使用-E
or+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
上面告訴我們
fd
0 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
它的標準輸入上還有管道)