web-dev-qa-db-ja.com

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

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

_> cmd1 | cmd2
_

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

また、逆の場合も、_cmd2_が_cmd1_の名前/ PIDを取得する方法はありますか?

私は、出力が端末に送られる(または入力が端末に送られる)かどうかを確認するisatty(3)があることを知っているので、反対側についてもう少し調べる方法があるかどうか疑問に思いました。

8
shark.dp

パイプは/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または+Eフラグも使用できます。

-p <pid>-d <descriptor>と組み合わせて、特定のpidの特定のdescriptorのエンドポイント情報を取得できます。

$ 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

上記で、fdsh 0は、もう一方の端にsleepのfd 1があるパイプであると説明しました。 -E+Eに変更すると、sleepのそのfdの完全な情報も取得されます。

$ 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がそのstdinにパイプを持っている方法を参照してください)

14
Hauke Laging