私のアプリケーションの中間のどこかでフレームワーク(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>