Crie um retrato de recursos

ShellBeginner
Pratique Agora

Introdução

A FRAME Studio está verificando a estação Linux usada para exportar fotos de um evento. Antes de observar uma sessão longa, precisa de leituras confiáveis: tempo de CPU não ocioso, memória não disponível de imediato e uso do sistema de arquivos que contém o diretório de exportação. Uma leitura alta é um sinal a interpretar, não uma prova de que o trabalho falhou.

Você implementará três funções curtas de Bash e usará um adaptador preparado que executa comandos reais do Linux. É necessário conhecer caminhos no terminal, variáveis, funções, condições e laços Bash, como ensinado em Shell for Beginners. Os programas preparados conectam os comandos; você lerá essa conexão e implementará a lógica de porcentagens. Esta instância Linux independente contém dois pequenos sistemas de arquivos ext4 reais para a prática. Prepará-los e montá-los não é tarefa do aluno. A duração é uma estimativa do autor que inclui leitura e erros comuns.

Meça o tempo de CPU não ocioso

Nesta etapa, você observará um retrato de recursos funcional e implementará a conversão de CPU.

Comece em Terminal. Todos os comandos deste laboratório são executados aqui. Entre no espaço preparado; pwd mostra a localização e ls lista os arquivos. Se depois não encontrar um arquivo por caminho relativo, use novamente este comando cd completo em vez de reiniciar a instância.

Como inserir comandos

Clique dentro de Terminal antes de digitar. Copie apenas o conteúdo do bloco de comandos; não digite o prompt, as crases externas nem um exemplo de saída esperada. Pressione Enter após cada comando e espere o prompt voltar antes de continuar. Um comando pode terminar com sucesso sem imprimir nada. Mantenha o mesmo Terminal aberto durante todo o laboratório.

cd /home/labex/project/resource-watch
pwd

O caminho deve terminar em /resource-watch. Execute a demonstração preparada com Bash:

bash demo.sh

A primeira linha nomeia quatro campos. A próxima contém uma marca de tempo UTC e três porcentagens reais. Os valores variam. demo.sh é um exemplo funcional fornecido; não completa suas funções nem salva sua resposta.

UTC timestamp | CPU non-idle % | memory pressure % | target filesystem used %
2026-...Z ... ... ...

As porcentagens de CPU descrevem o tempo das CPUs virtuais da instância. vmstat informa a atividade do sistema. Em vmstat 1 2, 1 é o intervalo em segundos e 2 é a quantidade de relatórios. O primeiro relatório de CPU é a média desde a inicialização; o segundo cobre o novo intervalo. Execute antes de extrair campos:

LC_ALL=C vmstat 1 2

LC_ALL=C aplica a este comando um formato numérico estável em inglês. Procure id nas colunas de CPU: é o tempo ocioso. O curso define não ocioso = 100 - ocioso. Isso inclui espera de E/S e tempo roubado; não representa apenas a execução do seu programa nem um diagnóstico de falha.

O adaptador usa um pipeline: | envia a saída de um comando ao próximo. tail -n 1 seleciona a última linha. awk '{print $15}' imprime seu décimo quinto campo separado por espaços, a coluna id desta versão preparada do procps. As aspas simples preservam $15 para o awk, impedindo sua expansão pelo shell. Confirme que o valor extraído é inteiro:

LC_ALL=C vmstat 1 2 | tail -n 1 | awk '{print $15}'

Agora edite as funções fornecidas. nano é um editor de terminal. Abra o arquivo e substitua apenas o : dentro de cpu_nonidle, mantendo as outras funções intactas. Os dois-pontos são um marcador que não faz nada.

nano metrics.sh

Mova o cursor com as setas. Na primeira função, apague apenas a linha com os dois-pontos e insira as duas linhas indentadas abaixo. Preserve o nome da função, as chaves de abertura e fechamento e as outras funções. O exemplo completo mostra o resultado desejado; não cole uma segunda cópia abaixo do original. A indentação facilita a leitura; as chaves e a grafia devem estar corretas.

A primeira função deve ficar assim:

cpu_nonidle() {
    local idle=$1
    echo $((100 - idle))
}

$1 é o primeiro argumento da função. local mantém a variável dentro dela. $((...)) faz aritmética inteira e echo imprime o resultado. Pressione Ctrl+O, Enter, Ctrl+X para salvar e sair. Se uma edição posterior causar erro de sintaxe, reabra o arquivo e corrija a função afetada; o amostrador preparado continua intacto.

Função de CPU no nano com os outros dois marcadores intactos

Neste exemplo só a primeira função está completa; os outros dois marcadores de dois-pontos são intencionais. Na parte inferior do nano, o circunflexo representa Ctrl. Por exemplo, ^O significa segurar Ctrl e pressionar O, não digitar esses dois caracteres.

Nano pede o nome ao salvar metrics.sh

Após Ctrl+O, o nano pede o nome do arquivo na parte inferior. Deixe o nome existente e pressione Enter para confirmar; depois Ctrl+X retorna ao prompt do shell. Se abriu o arquivo errado, pressione Ctrl+X e responda N à pergunta sobre salvar; depois abra o correto. Não digite comandos do shell enquanto o editor estiver aberto.

source carrega definições no shell atual. Terminal inicia Zsh, mas este exercício usa Bash: utilize bash -c para executar o teste entre aspas em Bash. As aspas simples externas preservam o comando interno.

bash -c 'source ./metrics.sh; cpu_nonidle 97'
3

Este valor ocioso fornecido testa a aritmética; não afirma que a porcentagem atual seja exatamente 3%. Confira também os dois extremos:

bash -c 'source ./metrics.sh; cpu_nonidle 0; cpu_nonidle 100'
100
0

Sua função funciona com qualquer valor ocioso inteiro de 0 a 100. O amostrador real fornecerá o valor recém-medido.

Diferencie memória disponível e memória livre

Nesta etapa, você calculará a pressão de memória usando a memória que o Linux estima disponível para novos aplicativos.

Permaneça em Terminal, em /home/labex/project/resource-watch. free -k mostra memória em KiB, unidades de 1024 bytes. Execute o comando antes de analisá-lo:

LC_ALL=C free -k

Leia a linha Mem:. free é a memória totalmente sem uso; available estima o que novos aplicativos podem usar sem troca, incluindo parte do cache recuperável. Não considere todo o cache permanentemente indisponível. O curso usa floor((total - available) * 100 / total) como porcentagem de pressão. Isso não prevê se uma alocação futura específica terá sucesso.

O adaptador seleciona total e disponível da mesma linha. No awk, /^Mem:/ corresponde a uma linha que começa com Mem:; $2 e $7 selecionam o segundo e o sétimo campos.

LC_ALL=C free -k | awk '/^Mem:/ {print $2, $7}'

A saída contém o total e depois a memória disponível. Ambos usam a mesma unidade, portanto a proporção faz sentido. Por exemplo, total 1000 e disponível 750 representam 25%, não 75%.

Abra o arquivo e substitua apenas o marcador de memory_pressure:

nano metrics.sh
memory_pressure() {
    local total=$1 available=$2
    echo $(((total - available) * 100 / total))
}

A divisão inteira do Bash descarta a parte fracionária. Como as entradas são não negativas e o total é positivo, truncar equivale a arredondar para baixo. Multiplique antes de dividir para não perder a fração cedo demais. Salve com Ctrl+O, Enter, Ctrl+X.

bash -c 'source ./metrics.sh; memory_pressure 1000 750; memory_pressure 3 2'
25
33

O resultado 33 é intencional quando uma de três unidades está indisponível. O contrato usa unidades inteiras de mesmo tamanho e um valor disponível entre zero e o total. Entradas inválidas são tratadas fora deste pequeno exercício.

No primeiro teste, 1000 - 750 = 250 unidades indisponíveis, então 250 × 100 ÷ 1000 = 25. No segundo, uma de três unidades está indisponível: 33.333… vira 33 porque a função retorna um inteiro. O segundo argumento é a quantidade disponível, não uma porcentagem já calculada. Preserve a função de CPU concluída na etapa anterior.

Amostre o sistema de arquivos correto

Nesta etapa, você completará a função do sistema de arquivos e salvará uma observação completa.

Permaneça em Terminal, em /home/labex/project/resource-watch. Os diretórios exports e reference pertencem a sistemas ext4 preparados distintos. Preserve os materiais e as notas originais de ambos. Você apenas observará o espaço: não apague materiais, não altere montagens e não tente encher os sistemas.

df informa o sistema de arquivos que contém o caminho indicado. A opção -P fornece uma disposição previsível com uma linha por sistema. Compare os caminhos:

df -P exports reference

Leia Capacity, não a quantidade de arquivos de um diretório. O uso de exports deve ser menor que o de reference. Executar df / descreveria outro sistema e não substitui o alvo selecionado.

No nano, substitua apenas filesystem_used:

nano metrics.sh
filesystem_used() {
    df -P "$1" | awk 'NR == 2 {gsub(/%/, "", $5); print $5}'
}

Aspas duplas preservam o caminho como um único argumento. NR == 2 seleciona a linha após o cabeçalho. gsub remove % do quinto campo antes de imprimi-lo. Salve com Ctrl+O, Enter, Ctrl+X. Também é permitida outra implementação que retorne o mesmo inteiro para o sistema solicitado.

bash -c 'source ./metrics.sh; filesystem_used exports; filesystem_used reference'

Os dois números devem corresponder às respectivas linhas de df. Termine executando o programa preparado:

bash snapshot.sh

Agora ele imprime marca UTC, CPU não ociosa, pressão de memória e uso do sistema alvo, separados por tabulação. CPU e memória podem mudar entre comandos. Leia o adaptador para conectar as observações individuais:

cat capture.sh

O adaptador executa vmstat e free, chama suas funções e lê o alvo com df. $(...) captura a saída; read -r atribui os campos separados por espaços e <<< fornece a string capturada a essa leitura. A conexão está preparada; suas funções determinam as porcentagens.

Salve um retrato real. > redireciona a saída e substitui este arquivo único, sem alterar o histórico original do operador.

A extensão .tsv significa valores separados por tabulação: uma observação por linha, com uma tabulação entre campos. O retrato salva quatro campos nesta ordem: marca UTC, porcentagem de CPU não ociosa, porcentagem de pressão de memória e porcentagem de uso do sistema alvo. UTC é um padrão de tempo comum; o Z final indica UTC. Essas porcentagens descrevem recursos diferentes: não as some nem espere um total de 100.

bash snapshot.sh > snapshot.tsv
cat snapshot.tsv

Se errar um nome de arquivo ou função, use ls, reabra metrics.sh, corrija e repita o comando de retrato. Não substitua uma observação que falhou por números inventados. Você agora tem um amostrador Bash com cálculos e alvo explícitos.

Resumo

Você mediu CPU não ociosa em um novo intervalo, calculou pressão a partir da memória disponível e selecionou o sistema de arquivos do alvo real. Suas três funções Bash produzem um retrato real. O próximo laboratório independente fornece essas funções e adiciona regras de aviso e preservação do histórico.