Como verificar qual processo está usando um determinado descritor de arquivo?

1

Em algum lugar no meio do meu aplicativo, o framework que estou usando ( ROOT ) me dá o seguinte erro:

 *** 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)

Como posso verificar qual processo está usando este descritor de arquivo, de preferência sem sudo ?

    
por RSFalcon7 15.04.2013 / 18:49

3 respostas

4

Eu temo que isso seja impossível depois. Afinal, "pipe quebrado" significa que o outro processo desapareceu (ou pelo menos fechou seu descritor de arquivo).

Enquanto tudo ainda está bem, você pode fazer isso:

sleep 1000 | sleep 1000
PID=12345 # PID of one of the sleep processes
ls -l /proc/$PID/fd
# output [...]
l-wx------ 1 hl hauke 64 15. Apr 19:11 1 -> pipe:[108237859]
# output [...]
lsof -n | grep 108237859 # gives you all processes which have access to this pipe
sleep     12928     hl    1w     FIFO     0,8     0t0  108262866 pipe
sleep     12929     hl    0r     FIFO     0,8     0t0  108262866 pipe

Editar 1

Se lsof não estiver disponível:

for dir in /proc/[1-9]*; do
  test -r "$dir"/fd || continue
  if ls -ln "$dir"/fd | grep -q 108355662; then
    echo "PID: ${dir#/proc/}"
  fi
done
    
por 15.04.2013 / 19:21
2

O comando lsof mostrará os descritores abertos e, em seguida, apenas o grep.

    
por 15.04.2013 / 19:20
1

Sem lsof , você pode tentar:

find /proc -name <descriptor> | grep fdinfo

Ele deve retornar alguns resultados do formulário ./<pid>/fdinfo/<fd>

    
por 15.04.2013 / 19:38