recuperar estatísticas do disco na linha de comando

3

Como posso mais portably obter estatísticas de disco a partir de um script bash?

já estou usando

cat /sys/block/*/stat

para calcular a largura de banda geral por disco / partição, no entanto, estou tentando também determinar o tamanho total do disco e o número de setores usados / livres.

Eu sei que essas estatísticas estão disponíveis usando df , mas estou procurando uma alternativa (como df faz seu back-end funcionar?), algo que prefere usar /sys/class/ ou /sys/block/ .

Isso é possível? Ou precisaria usar df | awk top para obter as estatísticas que estou procurando?

editar

Usar:

É para uso em um script de relatório de métricas que coletará vários bits de informações do sistema e as reportará a um sistema de gráficos.

i.e. estatísticas de leitura / gravação do setor de captura

for device in /sys/block/*
do

    stats=$( cat $device/stat )

    sectorsRead=$( echo $stats | awk '{print $3}' )
    sectorsWrite=$( echo $stats | awk '{print $7}' )

    doSomethingWith sectorsRead
    doSomethingWith sectorsWrite
done

Eu estou olhando para fazer algo semelhante, mas pegue número total de setores, vs setores utilizados / livre.

    
por Matt Clark 08.12.2016 / 20:16

1 resposta

6

A ferramenta mais portátil para o que você está tentando fazer é df . Não mexa com /sys , o que não é garantido que esteja em qualquer sistema não-Linux. E não reinvente a roda. É precisamente para isso que o df é e por que é especificado pelo POSIX.

Naturalmente, as coisas não são tão simples e existem várias implementações de df , algumas das quais têm formatos diferentes. No entanto, as pessoas boas que escrevem as especificações POSIX têm, em sua sabedoria infinita, incluído a seguinte opção na especificação de df :

 -P
    Produce output in the format described in the STDOUT section.

Então, se você sempre usa df -P , isso deve ser o mais portátil possível. Ao usar esse sinalizador, qualquer versão df compatível com POSIX (que deve ser todas ou o mais próximas que não faz diferença) produzirá oputput seguindo a especificação abaixo (tirada do POSIX df page ):

When both the -k and -P options are specified, the following header line shall be written (in the POSIX locale):

"Filesystem 1024-blocks Used Available Capacity Mounted on\n"

When the -P option is specified without the -k option, the following header line shall be written (in the POSIX locale):

"Filesystem 512-blocks Used Available Capacity Mounted on\n"

The implementation may adjust the spacing of the header line and the individual data lines so that the information is presented in orderly columns.

The remaining output with -P shall consist of one line of information for each specified file system. These lines shall be formatted as follows:

"%s %d %d %d %d%% %s\n", , , , , ,

In the following list, all quantities expressed in 512-byte units (1024-byte when -k is specified) shall be rounded up to the next higher unit. The fields are:

The name of the file system, in an implementation-defined format. The total size of the file system in 512-byte units. The exact meaning of this figure is implementation-defined, but should include , , plus any space reserved by the system not normally available to a user. The total amount of space allocated to existing files in the file system, in 512-byte units. The total amount of space available within the file system for the creation of new files by unprivileged users, in 512-byte units. When this figure is less than or equal to zero, it shall not be possible to create any new files on the file system without first deleting others, unless the process has appropriate privileges. The figure written may be less than zero. The percentage of the normally available space that is currently allocated to all files on the file system. This shall be calculated using the fraction: /( + )

expressed as a percentage. This percentage may be greater than 100 if is less than zero. The percentage value shall be expressed as a positive integer, with any fractional result causing it to be rounded to the next highest integer.

The directory below which the file system hierarchy appears.

Você provavelmente também deve usar o sinal -k para sempre ter os resultados impressos como unidades de 1024 bytes em vez de 512. E você também pode definir LC_ALL=POSIX para garantir que a localidade não afetará a saída. Colocando tudo isso junto dá:

Combinando isso com o também ultra-portátil awk , você pode fazer:

totalSectors=$(env -i LC_ALL=POSIX df -k -P /dev/sda1 | awk 'NR>1{print $2}')
usedSectors=$(env -i LC_ALL=POSIX df -k -P /dev/sda1 | awk 'NR>1{print $3}')
availableSectors=$(env -i LC_ALL=POSIX df -k -P /dev/sda1 | awk 'NR>1{print $4}')
    
por 08.12.2016 / 20:51