Come eseguire il debug di "troppi file aperti"?

4

Ho un programma che si chiude dopo un po 'con "troppi file aperti". Come posso rintracciare quali file sono aperti e chiusi? So che posso impostare questo limite su un valore più alto, ma questo rimanderebbe solo il problema.

Ricordo di aver usato un programma come dtruss o dtrace per quello scopo ma non riesco a ricordare come l'ho invocato e --help ha dato molta confusione.

Eseguo quel programma con uno script wrapper basato su nodejs, quindi devo seguire i processi figli.

Domanda: qual è la migliore strategia per scoprire quali file (descrittori) sono aperti e quali sono chiusi?

    
posta topskip 10.05.2012 - 13:40
fonte

1 risposta

2

lsof ti mostrerà gli handle di file aperti.

Se sai che il PID usa il -p flag.

Ad esempio, sulla mia shell zsh al momento vedo:

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 colonna Type mostra i vari tipi di file o pseudo file che potrebbero essere aperti, socket, pipe, ecc.

ulimit o limit, a seconda del sistema e della shell consente di modificare il numero di file aperti.

    
risposta data 11.05.2012 - 00:06
fonte

Leggi altre domande sui tag