Se dois processos estiverem conectados por um tubo,
> cmd1 | cmd2
existe alguma maneira de cmd1
descobrir o nome (ou PID) do processo do outro lado do pipe ( 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 me perguntei se existe uma maneira de descobrir um pouco mais sobre o outro lado.
cmd2
bifurcado.cmd1 | (cmd2 & cmd3)
Respostas:
Você pode ver o tubo
/proc/$PID/fd
. O descritor é um link simbólico para algo assimpipe:[188528098]
. Com essas informações, você pode procurar o outro processo:Ou, se você quiser ter certeza (para processamento automático) de que o número é o soquete e não faz parte de um nome de arquivo:
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 terminal para um descritor específico de um determinado pid .Acima nos diz que
fd
0 desh
é um tubo com fd 1 desleep
na outra extremidade. Se você mudar-E
para+E
, também receberá as informações completas para esse código desleep
:(veja como
lsof
também tem o tubo no seu stdin)fonte
lsof
isso.