Utilities
如何檢查哪個程序正在使用給定的文件描述符?
在我的應用程序中間的某個地方,我正在使用的框架 (
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