내 애플리케이션 중간 어딘가에서 프레임워크(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>