2
respostas

[Projeto] Faça como eu fiz: obtendo informações de hardware do sistema

Execute o comando free em seu terminal, filtrando a linha sobre o uso de memória e formatando sua saída;
Observação: Tentei fazer filtrando do jeito que estava na opinião do instrutor com o comando

free -h | grep Mem | awk '{print "Total: " $2 ", Usada: " $3 ", Livre: " $4}’

porém não funcionou, resolvi ir no chat gpt (salvou muito) e a única opção que retornou saída foi a seguinte

juliene@juliene-PC:~$ free -h | awk 'NR==2 {print "Total:", $2, "| Usada:", $3, "| Livre:", $4}'
Total: 5,6Gi | Usada: 1,3Gi | Livre: 3,4Gi

a explicação desse comando:
O awk é uma linguagem de processamento de texto — ele lê a saída linha por linha e coluna por coluna.

NR = Number of Record → número da linha atual.
NR==2 → “Quando estiver na segunda linha, execute o que está entre {}”.

No caso do free -h, a segunda linha sempre contém os dados da memória RAM, então é ali que queremos mexer.

Se alguém tiver uma explicação melhor, agradeceria muito

2 respostas

finalização do projeto

#!/bin/bash

LOG_DIR="monitoramento_sistema"
mkdir -p "$LOG_DIR"

monitorar_logs() {

    if [ -f /var/log/auth.log ]; then
        grep -E "fail(ed)?|error|denied|unauthorized" /var/log/auth.log \
            | awk '{print $1, $2, $3, $5, $6, $7}' \
            > "$LOG_DIR/monitoramento_logs_auth.txt"
    else
        echo "$(date): Arquivo /var/log/auth.log não encontrado." \
            > "$LOG_DIR/monitoramento_logs_auth.txt"
    fi


    if [ -f /var/log/syslog ]; then
        grep -E "fail(ed)?|error|denied|unauthorized" /var/log/syslog \
            | awk '{print $1, $2, $3, $5, $6, $7}' \
            > "$LOG_DIR/monitoramento_logs_sistema.txt"
    else
        echo "$(date): Arquivo /var/log/syslog não encontrado." \
            > "$LOG_DIR/monitoramento_logs_sistema.txt"
    fi
}


monitorar_conectividade() {
    if ping -c 4 8.8.8.8 > /dev/null 2>&1; then
        echo "$(date): Conexão ativa" >> "$LOG_DIR/monitoramento_rede.txt"
    else
        echo "$(date): Sem conexão com a internet" >> "$LOG_DIR/monitoramento_rede.txt"
    fi


    if curl -s --head https://www.alura.com.br/ | grep "HTTP/2 200" > /dev/null; then
        echo "$(date): Conexão com a Alura bem-sucedida" >> "$LOG_DIR/monitoramento_rede.txt"
    else
        echo "$(date): Falha ao conectar com a Alura" >> "$LOG_DIR/monitoramento_rede.txt"
    fi
}

monitorar_disco() {
        df -h | grep -v "snapfuse" | awk '$5+0 > 70 {print $1 " está com " $5 " de uso."}' >> $LOG_DIR/monitoramento_disco.txt
        echo "Uso de disco no diretorios principal:" >> $LOG_DIR/monitoramento_disco.txt
        du -sh /home/juliene >> $LOG_DIR/monitoramento_disco.txt
        echo "$(date)" >> $LOG_DIR/monitoramento_disco.txt
}

monitorar_hardware() {
        echo "$(date): Uso de Memória RAM:" >> $LOG_DIR/monitoramento_hardware.txt
        free -h | awk 'NR==2 {print "Total:", $2, "| Usada:", $3, "| Livre:", $4}' >> $LOG_DIR/monitoramento_hardware.txt
        top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print "Uso da CPU: " 100 - $1 "%"}' >> $LOG_DIR/monitoramento_hardware.txt
        echo "Operações de leitura e escrita em disco:" >> $LOG_DIR/monitoramento_hardware.txt
        iostat | grep -E "Device|^sda|^sdb|^sdc" | awk '{print $1, $2, $3, $4}' >> $LOG_DIR/monitoramento_hardware.txt
}

executar_monitoramento() {
        monitorar_logs
        monitorar_conectividade
        monitorar_disco
        monitorar_hardware
}

Oi, Juliene!

Que bacana ver você explorando awk e montando seu próprio script, está no caminho certo.

1) Por que free -h | grep Mem | awk ... pode não funcionar:
Alguns motivos comuns:

  • Localização/idioma: em muitos sistemas a linha começa com Mem: (com dois pontos). Se você usar grep Mem sem ancorar no início, pode coincidir algo indesejado; se usar grep "^Mem" e a palavra estiver diferente (ex.: outro idioma), não bate.
  • Espaçamento variável: o espaçamento entre colunas muda de acordo com o terminal e o tamanho dos números; como você usou $2, $3, $4 em awk, está ok, mas se o grep não capturar a linha certa, nada chega ao awk.
  • Cabeçalhos e formato: versões diferentes do procps podem alterar levemente o cabeçalho.

Sua solução awk 'NR==2' funciona bem porque a segunda linha do free traz os dados da RAM em praticamente todas as versões, independentemente do idioma. É uma forma simples e robusta.

2) Formas mais confiáveis de pegar a linha da RAM:

Se quiser manter filtragem por conteúdo (e não por número da linha), prefira ancorar o início e aceitar variações:

# 2.1) Forte quanto a idioma (desde que comece com "Mem")
free -h | awk '/^Mem/ {print "Total:", $2, "| Usada:", $3, "| Livre:", $4}'

# 2.2) Forçar idioma "C" (útil se seu sistema estiver pt_BR e você quer previsibilidade)
LC_ALL=C free -h | awk '/^Mem/ {print "Total:", $2, "| Used:", $3, "| Free:", $4}'

# 2.3) Igual à sua (por linha), muito prática:
free -h | awk 'NR==2 {print "Total:", $2, "| Usada:", $3, "| Livre:", $4}'

Observação importante sobre “Usada”:

O free mostra as colunas: total, used, free, shared, buff/cache, available. A coluna used inclui buffers e cache. Se você quiser a memória “realmente” usada por apps, uma métrica comum é:

used_real = total - free - buff/cache

Em awk:

free -m | awk '/^Mem/ {used=$2-$4-$6; printf "Total: %sMi | Usada(real): %sMi | Livre: %sMi | Buff/Cache: %sMi\n", $2, used, $4, $6}'

Pontos fortes do seu script:

  • Estrutura em funções (ótimo para ler e manter).
  • Logs separados por categoria.
  • Testes de existência dos arquivos de log.
  • Checagem de conectividade (ping e curl).

Continue firme nos estudos.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!