Eu tenho um script que é iniciado como parte de um daemon e executa um loop infinito para carregar dados em um banco de dados. Dependendo da hora, os dados são carregados em uma das 24 tabelas e todos os dados da tabela que contém dados para a próxima hora à frente são removidos para que nunca haja mais de um dia de dados armazenados no banco de dados. Os dados são carregados usando um aplicativo chamado fluxo de dados, que acredito ser escrito em Java. Meu script está perdendo em média 15m de memória a cada iteração do loop - que continua em execução até ficar vazio (normalmente leva alguns dias).
Para testar com mais facilidade de onde o vazamento estava vindo, coloquei os comandos que estavam sendo executados no loop em um script separado e chamei esse script do loop. A seguir, o conteúdo desse script:
#!/bin/bash
MYTABLECLEAR=$1
LOG_FILE=$2
DR_HOME=$3
CP_PLUGIN=$4
HOME_DIR=$5
PROPERTIES_HC=$6
#Run SQL to clear down table table 1 hour ahead of now (23 hours behind)
(sql -uactian echo <<-EOSQL
MODIFY reverb$MYTABLECLEAR TO TRUNCATED;\g
EOSQL
) 1> /dev/null 2>> $LOG_FILE
#Run Dataflow
$DR_HOME/bin/dr -cp $CP_PLUGIN -Xmx64g --engine parallelism=1 --runjson $HOME_DIR/workflows/dl_Reverb.dr --overridefile $PROPERTIES_HC 1> /dev/null 2>> $LOG_FILE
Se eu comentar as seções Executar SQL e Executar Fluxo de Dados deste código enquanto meu serviço estiver em execução, minha perda de memória será atenuada, ou seja, não receberei nada, mas isso não ficará pior. Se eu, então, não comentar qualquer um desses, meu vazamento será retomado.
Se eu parar o serviço, recupero toda a memória imediatamente.
Eu tentei monitorar os PIDs dos processos que estou executando, adicionando um echo "PID: " $! >> $LOG_FILE
após cada processo, mas o arquivo de log apenas fica em branco.
Alguma idéia de por que meu roteiro está se mantendo na memória e como eu posso fazer isso?