両方のプロセスがパイプを介して接続されると、
> 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
上記は、fd
0 ofsh
がパイプで、sleep
もう一方の端が fd 1 of であることを示します。 fdを次の-E
ように変更すると、+E
fdに関する完全な情報を取得することもできます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
標準入力にもパイプがあることを確認してください)