如何检查哪个进程正在使用给定的文件描述符?

如何检查哪个进程正在使用给定的文件描述符?

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

相关内容