(Seu loop perdeu ''
causando o problema via substituição de comando, como notado por val0x00ff e Patrick. Isto é para a segunda parte sobre encontrar outra maneira de resolver o problema.)
Você pode mostrar o número de descritores de arquivo por processo usando lsof
diretamente:
lsof -Fpcn | nawk '
/^p/ { pid=substr($0,2) }
/^c/ { cmd=substr($0,2) }
/^n/ { fd[cmd"["pid"]"]++ }
END { for (cc in fd) printf("%-20s %i\n",cc,fd[cc]) } ' | sort -n -k 2
Isso deve funcionar na maioria dos sistemas * nix com lsof
.
A opção -Fpcn
exibe um formato "legível por máquina" que marca cada linha:
- PIDs com um "p" líder
- saída de comando (nome) com um "c" principal
- saída do descritor de arquivo com um "n" principal
O script awk monitora a contagem do descritor de arquivo usando uma matriz associativa (indexada por "comando [pid]") e despeja a matriz na END{}
da entrada.
Estas contagens FD diferem frequentemente de outros métodos, notáveis ps
ou /proc/PID/fd
contagens porque lsof
conta mais do que apenas descritores de arquivos reais, arquivos mapeados em memória, em particular, provavelmente irão lançar seus números para alguns processos. / p>
Se você quiser uma contagem precisa dos FDs reais, é necessário adicionar "-d0-999999" para limitar a saída lsof
apenas aos descritores de arquivos numéricos. Tecnicamente, o número alto deve ser pelo menos o número máximo de FDs por processo, provavelmente pode determinar isso com ulimit -n
ou getconf OPEN_MAX
, mas o root pode mudar isso. No Linux, você pode inspecionar os limites de cada processo em /proc/PID/limits
e pode usar /proc/sys/fs/file-nr
como limite superior.
Outras formas baratas e alegres de contar descritores de arquivos em um sistema Linux com /proc
:
(cd /proc; ls -d [0-9]* ) | while read pid; do set -- /proc/$pid/fd/*; echo $pid $#; done
ps axo "pid" | while [...]