1
resposta

[Bug] Cria o diretório mas joga todos logs para dentro de um único arquivo .txt

#!/bin/bash

if [ ! -d log ]
then
    mkdir log
fi

processos_memoria(){
processos=$(ps -eo pid --sort -size | head -n 11 | egrep '[0-9]')
    for pid in $processos
    do
        nome_processo=$(ps -p $pid -o comm=)
        echo -n  $(date +%F,%H:%M:%S,) >> log/$nome_processo.log
        tamanho_processo=$(ps -p $pid -o size | egrep '[0-9]')
        echo "$(bc <<< "scale=2;$tamanho_processo/1024") MB" >> log/$nome_processo.log
    done
}

processos_memoria
if [ $? -eq 0 ]
then
    echo "=============================="
    echo "Os arquivos foram salvos com sucesso !!!"
    echo "=============================="
else
    echo "=============================="
    echo "Houve um erro na hora de salvar os arquivos"
    echo "=============================="
fi

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeúnico arquivo dentro da pasta "log"

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeos logs foram salvos todos dentro do mesmo arquivo txt

1 resposta

Oii, Wellington! Tudo bem?

O problema pode estar relacionado à forma como os nomes dos processos estão sendo obtidos ou manipulados no script. Uma possível causa é que o nome do processo pode conter espaços ou caracteres especiais que não estão sendo tratados corretamente, fazendo com que o redirecionamento de saída >> não funcione como esperado.

Uma sugestão é verificar e tratar os nomes dos processos para garantir que eles sejam válidos como nomes de arquivo. Você pode adicionar uma linha para substituir espaços e caracteres especiais nos nomes dos processos.

Desse jeito, por exemplo:

#!/bin/bash

if [ ! -d log ]
then
    mkdir log
fi

processos_memoria(){
processos=$(ps -eo pid --sort -size | head -n 11 | egrep '[0-9]')
    for pid in $processos
    do
        nome_processo=$(ps -p $pid -o comm= | tr -d ' ' | tr -cd '[:alnum:]_-.')
        echo -n  $(date +%F,%H:%M:%S,) >> log/$nome_processo.log
        tamanho_processo=$(ps -p $pid -o size | egrep '[0-9]')
        echo "$(bc <<< "scale=2;$tamanho_processo/1024") MB" >> log/$nome_processo.log
    done
}

processos_memoria
if [ $? -eq 0 ]
then
    echo "=============================="
    echo "Os arquivos foram salvos com sucesso !!!"
    echo "=============================="
else
    echo "=============================="
    echo "Houve um erro na hora de salvar os arquivos"
    echo "=============================="
fi

No código acima, usei tr -d ' ' para remover espaços e tr -cd '[:alnum:]_-.') para manter apenas caracteres alfanuméricos, sublinhados, pontos e hífens, que são seguros para nomes de arquivos em sistemas do tipo Unix.

Se outra dúvida surgir, estamos disponíveis.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software