¿Cómo depurar “demasiados archivos abiertos”?

4

Tengo un programa que se cierra después de un tiempo con "demasiados archivos abiertos". ¿Cómo puedo rastrear qué archivos están abiertos y cerrados? Sé que puedo establecer un valor más alto para este límite, pero eso solo aplazaría el problema.

Recuerdo que usé un programa como dtruss o dtrace para ese propósito, pero no recuerdo cómo lo invocé y --help le dio mucha confusión.

Ejecuto ese programa con un script de envoltorio basado en nodejs, así que necesito seguir los procesos secundarios.

Pregunta: ¿cuál es la mejor estrategia para averiguar qué archivos (descriptores) se abren y cuáles se cierran?

    
pregunta topskip 10.05.2012 - 13:40

1 respuesta

2

lsof te mostrará los manejadores de archivos abiertos.

Si conoce el PID, use el indicador -p .

Por ejemplo, en mi shell zsh en el momento que veo:

alex@smiley:~|⇒  lsof -p 82946
COMMAND   PID USER   FD   TYPE DEVICE  SIZE/OFF     NODE NAME
zsh     82946 alex  cwd    DIR  14,12      2414   186278 /Users/alex
zsh     82946 alex  txt    REG  14,12   1103984       73 /bin/zsh
zsh     82946 alex  txt    REG  14,12    474672   787843 /usr/lib/zsh/4.3.11/zsh/zle.so
zsh     82946 alex  txt    REG  14,12    258672   787864 /usr/lib/zsh/4.3.11/zsh/complete.so
zsh     82946 alex  txt    REG  14,12    120576   787863 /usr/lib/zsh/4.3.11/zsh/complist.so
zsh     82946 alex  txt    REG  14,12     71264   787838 /usr/lib/zsh/4.3.11/zsh/zutil.so
zsh     82946 alex  txt    REG  14,12     79968   787852 /usr/lib/zsh/4.3.11/zsh/parameter.so
zsh     82946 alex  txt    REG  14,12    599280  7719861 /usr/lib/dyld
zsh     82946 alex  txt    REG  14,12 296980480 12427083 /private/var/db/dyld/dyld_shared_cache_x86_64
zsh     82946 alex    0u   CHR   16,0   0t26354     6285 /dev/ttys000
zsh     82946 alex    1u   CHR   16,0   0t26354     6285 /dev/ttys000
zsh     82946 alex    2u   CHR   16,0   0t26354     6285 /dev/ttys000
zsh     82946 alex   10u   CHR   16,0    0t3432     6285 /dev/ttys000

La columna Tipo muestra los diversos tipos de archivos o pseudo archivos que pueden estar abiertos, sockets, tuberías, etc.

ulimit o limit, dependiendo del sistema y el shell te permite cambiar el número de archivos abiertos.

    
respondido por el Alex 11.05.2012 - 00:06

Lea otras preguntas en las etiquetas