Bom dia Mestre, estou gostando muito do curso, estou seguindo as aulas utilizando containers docker em uma VM Linux, e estou tendo dificuldades para converter esse script para ".bash" para rodar dentro do container, até utilizei da IA, porem ao executar o script, esta entra em looping infinito, pq o script executa consulta no DB, poderia me ajudar com isso?
Segue script testado om looping infinito `#!/bin/bash
Configurações
STATEMENT_KEYWORD="statement:"
DURATION_KEYWORD="duration:"
POSTGRES_VERSION="16"
TABLE_NAME="query_logs"
Variáveis de conexão
PGUSER="postgres"
PGPASSWORD="postgres"
PGDATABASE="FRUTALLY_VENDAS"
PGHOST="localhost"
PGPORT="5432"
Caminhos
LOG_DIR="/var/lib/postgresql/data/log/"
TEMP_SQL_FILE="/tmp/insert_queries.sql"
Criar arquivo temporário
mkdir -p /tmp
> "$TEMP_SQL_FILE"
echo "Iniciando análise de logs..."
Função para processar um statement
process_statement() {
local datetime="$1"
local duration="$2"
local query="$3"
Limpar e formatar valores
datetime=$(echo "$datetime" | sed 's/ LOG:.*//' | sed 's/ CEST.*//')
duration=$(echo "$duration" | sed "s/.*$DURATION_KEYWORD\s*//" | sed 's/ ms//')
query=$(echo "$query" | sed "s/^$STATEMENT_KEYWORD\s*//" | xargs)
Verificar se é uma linha válida
if [ -z "$datetime" ] || [ -z "$duration" ] || [ -z "$query" ]; then
echo "Erro: Valores inválidos detectados"
return 1
fi
Ignorar queries que referenciam a própria tabela de logs
if [[ "$query" == *"$TABLE_NAME"* ]]; then
echo "Consulta descartada por referenciar a tabela."
return 0
fi
Escapar aspas simples para SQL
query_escaped=$(echo "$query" | sed "s/'/''/g")
Verificar se a consulta já existe
check_sql="SELECT COUNT(*) FROM $TABLE_NAME WHERE log_time = '$datetime' AND duration_s = $duration AND query = '$query_escaped';"
check_result=$(PGPASSWORD="$PGPASSWORD" psql -U "$PGUSER" -d "$PGDATABASE" -h "$PGHOST" -p "$PGPORT" -c "$check_sql" -t)
if [ "$check_result" -eq 0 ]; then
echo "INSERT INTO $TABLE_NAME (log_time, duration_s, query, checkquery) VALUES ('$datetime', $duration, '$query_escaped', 'NOTCHECK');" >> "$TEMP_SQL_FILE"
else
echo "Query já incluída na tabela"
fi
}
Processar arquivos de log
for logfile in "$LOG_DIR"/*.log; do
echo "Processando arquivo de log: $logfile"
Variáveis de estado
accumulating_query=false
statement_line=""
query=""
duration_line=""
datetime=""
while IFS= read -r line; do
Verificar se é uma linha de statement
if [[ "$line" == *"$STATEMENT_KEYWORD"* ]]; then
Processar statement anterior se existir
if [ "$accumulating_query" = true ] && [ -n "$statement_line" ]; then
process_statement "$datetime" "$(echo "$duration_line" | grep -oP "$DURATION_KEYWORD \K[0-9.]+")" "$query"
fi
accumulating_query=true
statement_line="$line"
query=$(echo "$line" | sed "s/.*$STATEMENT_KEYWORD\s*//")
Extrair datetime da linha
datetime=$(echo "$line" | grep -oP '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}')
elif [ "$accumulating_query" = true ]; then
Verificar se é uma linha de duration
if [[ "$line" == *"$DURATION_KEYWORD"* ]]; then
duration_line="$line"
process_statement "$datetime" "$(echo "$duration_line" | grep -oP "$DURATION_KEYWORD \K[0-9.]+")" "$query"
accumulating_query=false
statement_line=""
query=""
duration_line=""
else
# Acumular linhas da query
query="$query $line"
fi
fi
done < "$logfile"
done
echo "Filtragem de logs concluída"
Executar comandos SQL gerados
if [ -s "$TEMP_SQL_FILE" ]; then
echo "Executando comandos SQL..."
psql -U "$PGUSER" -d "$PGDATABASE" -h "$PGHOST" -p "$PGPORT" -f "$TEMP_SQL_FILE"
else
echo "Nenhum comando SQL para executar."
fi
echo "Processamento concluído"`