Como impor limites de memória em um script de shell?

10

Eu tenho um script PHP que, enquanto uma pasta contém arquivos XML, os processará no banco de dados.

Atualmente, o servidor está executando o PHP versão 5.3.10 e há um relatório de erro sobre problemas de memória acionados por ZEND_MM_HEAPum loop.

Isso faz com que o PHP não libere memória adequadamente, levando a um erro e uma falha no script:

 zend_mm_heap is corrupted

Algumas soluções foram encontradas, mas não tenho acesso às configurações do servidor.

Para lidar com isso, preparei o seguinte script bash para cuidar do loop, deixando o script PHP responsável apenas pelo processamento do arquivo XML:

#!/bin/bash

# Check for files to process
# If files are present, call
# the PHP script

DIR="/path/to/dir/with/files"
while [ "$(ls -A $DIR)" ]; do
        php /path/to/php/script/myscript.php
done

Meu objetivo agora é limitar essa alocação de memória do bash (memória e memória virtual), impedindo a interrupção do sistema se algo der errado.

Minha pergunta é:
Como posso limitar a memória usada por este script de shell para uma quantidade específica?

Zuul
fonte
1
Observe que você pode alterar a maneira como a memória é alocada, executando export USE_ZEND_ALLOC=0.
Pedro Cordeiro

Respostas:

12

Você pode limitar o uso da memória por um script Bash, fazendo o seguinte.

Limite o uso de memória em kb (2 GB neste exemplo):

ulimit -m 2048000

Limitar o uso da memória virtual:

ulimit -v 2048000

Defina o limite da memória virtual como limite rígido, para que o processo seja interrompido ao exceder esse limite:

ulimit -H -v

Eu acho que isso pode fazer o que você quiser.

Octávio Filipe Gonçalves
fonte
1
Esse limite também conta para processos filho? Por exemplo, se eu gerar um REPL erlang neste script bash, o limite de memória será imposto?
Christophe De Troyer
2
@ChristopheDeTroyer O limite será herdado pelos processos filhos, portanto, os processos filhos não podem exceder isso. Mas esse limite não será aplicado a toda a árvore de processos.
cartunista