Utilities

如何檢查哪個程序正在使用給定的文件描述符?

  • November 5, 2021

在我的應用程序中間的某個地方,我正在使用的框架 ( 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

以後恐怕是不可能的了。畢竟“破管道”意味著另一個程序已經消失(或者至少已經關閉了它的文件描述符)。

雖然一切都還可以,但您可以這樣做:

$ 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

引用自:https://unix.stackexchange.com/questions/72517