Nome do processo na outra extremidade de um pipe unix?

7

Se dois processos estiverem conectados por um pipe,

> cmd1 | cmd2

existe alguma maneira de cmd1 descobrir o nome (ou PID) do processo no outro lado do canal ( cmd2 )?

Além disso, vice-versa, existe alguma maneira de cmd2 obter o nome / PID de cmd1 ?

Eu sei que há isatty(3) para verificar se a saída vai para (ou a entrada vem de) um terminal, então eu me perguntei se há uma maneira de descobrir um pouco mais sobre o outro lado.

    
por shark.dp 18.11.2017 / 22:00

1 resposta

13

Você pode ver o canal em /proc/$PID/fd . O descritor é um link simbólico para algo como pipe:[188528098] . Com essa informação, você pode procurar pelo outro processo:

$ 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

Ou, se você quiser ter certeza (para processamento automático), que o número é o soquete e não parte de um nome de arquivo:

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

Com lsof 4,88 e acima, você também pode usar os sinalizadores -E ou +E :

Em combinação com -p <pid> , -d <descriptor> , você pode obter as informações do endpoint para um descritor específico de um dado 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

Acima nos informando que fd 0 de sh é um canal com fd 1 de sleep na outra ponta. Se você alterar -E para +E , também obterá todas as informações para esse fd de 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

(veja como lsof também tem o pipe em sua stdin)

    
por 18.11.2017 / 22:13