A memória deve ser liberada quando um programa é encerrado (independentemente de o programa ter sido liberado ou não). Por exemplo.
[kbrandt@ny-kbrandt01: ~] cat eat_mem.c
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main()
{
#1 GByte
const int m = 1024*1024*1024;
#Allocate a gig
void *p = (int*)malloc(m);
#Write a Gigs worth of zeros to that gig
memset(p,0,m);
sleep(10);
#In theory I should free(p) here (heh... heh... I said "free p", get it?)
return 0;
}
[kbrandt@ny-kbrandt01: ~] gcc eat_mem.c; ./a.out &; sleep 1; free -m;sleep 10; free -m
[1] 10666
total used free shared buffers cached
Mem: 7872 1848 6023 0 143 431
-/+ buffers/cache: 1273 6599
Swap: 30467 0 30467
[1] + done ./a.out
total used free shared buffers cached
Mem: 7872 823 7049 0 143 431
-/+ buffers/cache: 247 7624
Swap: 30467 0 30467
Portanto, supondo que seu script seja executado pelas saídas de tarefa agendadas, esse não seria o problema. Então você precisa ver qual programa está crescendo na memória. Você pode apenas observar isso usando top
(Você pode classificar por tamanho de memória residente pressionando F
(capital) e, em seguida, q
para RES no topo) e ver qual programa cresce.
Meu palpite é que ele será MySQL, porque o que seu script faz, ele faz coisas em SQL e SQL acaba usando mais memória. Isso provavelmente não é um problema se eu tivesse que adivinhar, o MySQL vai pegar a memória que pode obter e usá-la sabiamente na maior parte do tempo.