UNIXパイプの反対側のプロセスの名前?


8

2つのプロセスがパイプで接続されている場合、

> cmd1 | cmd2

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

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

私はそこにあることを知っているisatty(3)一方の側についてもう少し知るための方法があるかどうか、私は疑問に思ったので、ターミナル出力がに行く(または入力から来ている)かどうかをチェックします。


1
これはせいぜいプラットフォーム固有のものです。どこでやろうとしているの?
Michael Homer

Linux固有のバージョンで問題ないでしょう。
shark.dp

5
理論的には、cmd2分岐すると、パイプのもう一方の端に複数のプロセスが存在する可能性があります。
Nate Eldredge 2017年

6
これは可能かもしれませんが、それが良い考えであることを本当に疑っています。この質問はXY問題のようなにおいがします。
Nate Eldredge 2017年

@NateEldredge Indeed:cmd1 | (cmd2 & cmd3)
Barmar

回答:


14

でパイプを見ることができます/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以上、あなたも使用することができる-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のshfd sleepが反対側の1のパイプであることを示しています。に変更-Eすると+E、そのfd ofの完全な情報も取得できます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標準入力にパイプがある方法も参照してください)


6
これが失敗するように準備する必要があります。たとえば、相手側のプロセスがUIDを変更し、それにアクセスする権限がないlsof場合。
Nate Eldredge 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.