주어진 파일 설명자를 사용하는 프로세스를 확인하는 방법은 무엇입니까?

주어진 파일 설명자를 사용하는 프로세스를 확인하는 방법은 무엇입니까?

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

관련 정보