与えられたファイル記述子を使用するプロセスを確認するには?

与えられたファイル記述子を使用するプロセスを確認するには?

私のアプリケーションの中間のどこかでフレームワーク(ROOT) 次のエラーが発生します。

 *** Break *** write on a pipe with no one to read it
SysError in <TUnixSystem::UnixSend>: send (Broken pipe)
SysError in <TUnixSystem::DispatchOneEvent>: select: read error on 24
 (Bad file descriptor)

このファイル記述子を使用するプロセスと望ましくないプロセスをどのように確認できますかsudo

答え1

これからは不可能だと思いますので心配です。結局、「壊れたパイプ」は、他のプロセスが終了したことを意味します(または少なくともそのファイル記述子を閉じました)。

すべてが大丈夫なら、次のようにすることができます。

$ sleep 1000 | sleep 1000 & ps
[1] 848156
   PID TTY         TIME CMD
819441 pts/0   00:00:00 bash
848155 pts/0   00:00:00 sleep
848156 pts/0   00:00:00 sleep
848157 pts/0   00:00:00 ps
$ PID=848156 # PID of one of the sleep processes
$ ls -l /proc/$PID/fd
... # Skipped output lines
l-wx------ 1 hl hauke 64 15. Apr 19:11 1 -> pipe:[108237859]
... # Skipped output lines
$ lsof -n | grep 108237859 # gives you all processes which have access to this pipe
sleep     848155     hl    1w     FIFO     0,8     0t0  108237859 pipe
sleep     848156     hl    0r     FIFO     0,8     0t0  108237859 pipe

編集1

lsofが利用できない場合:

for dir in /proc/[1-9]*; do
  test -r "$dir"/fd || continue
  if ls -ln "$dir"/fd | grep -q 108237859; then
    echo "PID: ${dir#/proc/}"
  fi
done

答え2

このlsofコマンドは開かれた記述子を表示し、次にgrepを表示します。

答え3

いいえ、lsof試してみてください。

find /proc -name <descriptor> | grep fdinfo

フォームの一部の結果を返す必要があります。./<pid>/fdinfo/<fd>

関連情報