Cria um arquivo cujo tamanho em bytes é a porcentagem de espaço livre em um disco

4

Eu precisava de um método de linha de comando para criar um arquivo cujo tamanho em bytes fosse a porcentagem de espaço livre em um disco. Eu pretendo executá-lo via cron a cada cinco minutos, mas primeiro um script de shell serve.

A plataforma de destino é o ambiente BSD4.3 em DOMAIN / OS, então eu tenho ksh , awk , sed e os comandos BSD usuais, mas não as versões GNU.

Eu posso executar um comando lvolfs -a ( não um comando BSD) que lista o espaço livre do volume neste formato:

  # free   # total   % free         node id  entry directory
  732532   1295672       57           4D72C   /
 3787184   4165732       91           52055   //tr3
-------------------------------
 4519716   5461404    82.76%      2 volumes.

Assim, parece simples extrair os valores, neste caso 57 e 91, identificando-os pelos IDs dos nós hexadecimais, 4D72C e 52055, respectivamente.

Eu imediatamente pensei 'dd pode fazer isso', então, concentrando-me no nó 4D72C primeiro, eu criei:

/com/lvolfs -a | \
    awk -e '/4D72C/ { print $3 }' | \
    sed -e 's|^|dd if=/dev/rdsk of=//tr2/test/data/tr2.free bs=|' | \
    sed -e 's|$| count=1|' >//tr2/archive/dirlist

. //tr2/archive/dirlist

E dirlist parece

dd if=/dev/rdsk of=//tr2/test/data/tr2.free bs=57 count=1

Funciona, e eu precisarei repetir algo assim para o nó 52055, mas gostaria de saber se dd é a única maneira de usar comandos BSD realmente básicos. Alguém teria alguma sugestão?

EDIT: Mais algumas informações sobre o sistema de destino ... é uma HP / Apollo DN433 'Engenharia Workstation', os joelhos da abelha quando foi lançado no início dos anos 80, mas agora tão impressionante quanto um sistema 486DX. O sistema operacional nativo tenta imitar o Unix fornecendo um 'ambiente' BSD4.3 com um conjunto razoável de comandos BSD, mas há uma tentação de misturar comandos do BSD e Aegis (como lvolfs ) como eu fiz aqui.

Eu tenho duas estações de trabalho e cada uma controla o equipamento de teste automático. As duas estações de trabalho estão conectadas em rede e o diretório raiz da rede // inclui tr2 (ID do nó 4D72C) e tr3 (identificação do nó 52055). Você realmente não quer ou precisa saber tudo isso - Eu gostaria apenas de dar a impressão de que nada deveria ser dado como garantido. Não quero que ninguém perca muito tempo com essas coisas - esse é o meu trabalho, mas agradeço qualquer sugestão que você possa ter. O Korn Shell ainda é um mistério para mim.

UPDATE: o comando df -a em DOMAIN / OS fornece

$ df -a
Filesystem         kbytes    used   avail capacity  Mounted on
/dev/wn96a        1295672  563904  731768    44%    //tr2
/dev/wn96a        4165732  379804 3785928     9%    //tr3
                ----------------------------------
                  5461300  943700 4517600    17%

O qual, por mencionar os nomes mais familiares tr2 e tr3 , pode ser preferível. O único obstáculo ligeiro é que obtemos espaço em disco usado não livre , mas isso pode ser superado.

    
por pavium 29.01.2010 / 02:32

1 resposta

1

Eu usaria dd . Você diz "lvolfs -a (não um comando BSD)". Você tem df ? Essa seria uma maneira mais padrão e portátil de obter as informações de uso do volume.

Não deve ser necessário criar um arquivo de script temporário para fazer isso. Você deveria ser capaz de fazer:

dd if=/dev/rdsk of=//tr2/test/data/tr2.free bs=\
$(/com/lvolfs -a | awk -e '/4D72C/ { print $3 }') count=1

ou

avail=$(df /usr | awk -e 'NR==2 { print $5 }')
avail=${avail%*%}    # strip off the percent sign
dd if=/dev/rdsk of=//tr2/test/data/tr2.free bs=$avail count=1

(dependendo de como seus sistemas de arquivos são organizados e de como é a saída de df ).

Você pode até colocar o segundo em um loop:

for fs in / /usr /home    # list the ones you want to include
do
    avail=$(df $fs | awk -e 'NR==2 { print $5 }')
    avail=${avail%*%}     # strip off the percent sign
    # create a file on the particular filesystem/mount point
    dd if=/dev/rdsk of=//$fs/test/data/tr2.free bs=$avail count=1
done

Examine cuidadosamente antes de usá-lo para garantir que ele faz o que você pretende.

    
por 29.01.2010 / 07:58