2つのプロセスがパイプで接続されている場合、
_> cmd1 | cmd2
_
_cmd1
_がパイプ(_cmd2
_)の反対側にあるプロセスの名前(またはPID)を見つける方法はありますか?
また、逆の場合も、_cmd2
_が_cmd1
_の名前/ PIDを取得する方法はありますか?
私は、出力が端末に送られる(または入力が端末に送られる)かどうかを確認するisatty(3)
があることを知っているので、反対側についてもう少し調べる方法があるかどうか疑問に思いました。
パイプは/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
上記で、fd
のsh
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にパイプを持っている方法を参照してください)