Unixパイプの反対側のプロセス名は何ですか?

Unixパイプの反対側のプロセス名は何ですか?

両方のプロセスがパイプを介して接続されると、

> cmd1 | cmd2

cmd1パイプ()の反対側にあるプロセスの名前(またはPID)を見つける方法はありますかcmd2

cmd2また、その逆の場合でも名前/PIDを取得する方法はありますかcmd1

出力が端末に到着しているか(または入力が端末から来ているか)確認する必要があることを知っているので、isatty(3)相手の詳細を知る方法があるかどうか疑問に思います。

答え1

からパイプラインを見ることができます/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'

4.88以上の場合、またはフラグをlsof使用することもできます。-E+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 ofshがパイプで、sleepもう一方の端が fd 1 of であることを示します。 fdを次の-Eように変更すると、+Efdに関する完全な情報を取得することもできます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標準入力にもパイプがあることを確認してください)

関連情報