¿Cómo imponer límites de memoria en un script de shell?

10

Tengo un script PHP que, si bien una carpeta contiene archivos XML, los procesará en la base de datos.

Actualmente, el servidor ejecuta PHP versión 5.3.10 y hay un informe de error sobre problemas de memoria activados por ZEND_MM_HEAPun bucle.

Esto hace que el PHP no libere memoria correctamente, lo que genera un error y un bloqueo del script:

 zend_mm_heap is corrupted

Se encuentran algunas soluciones , pero no tengo acceso a la configuración del servidor.

Para lidiar con esto, he preparado el siguiente script bash para cuidar el ciclo, dejando que el script PHP solo sea responsable al procesar el archivo 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

Mi objetivo ahora es tener esta asignación de memoria bash limitada (memoria y memoria virtual), evitando así que se bloquee el sistema si algo sale mal.

Mi pregunta es:
¿Cómo puedo limitar la memoria utilizada por este script de shell a una cantidad específica?

Zuul
fuente
1
Tenga en cuenta que puede usar cambiar la forma en que se asigna la memoria, ejecutando export USE_ZEND_ALLOC=0.
Pedro Cordeiro

Respuestas:

12

Puede limitar el uso de memoria mediante un Bash Script, haciendo lo siguiente.

Limite el uso de memoria por kb (2GB en este ejemplo):

ulimit -m 2048000

Limite el uso de memoria virtual:

ulimit -v 2048000

Establezca el límite de memoria virtual en límite rígido, de modo que el proceso se cancele cuando se exceda este límite:

ulimit -H -v

Creo que esto puede hacer lo que quieras.

Octávio Filipe Gonçalves
fuente
1
¿Este límite también cuenta para procesos secundarios? Por ejemplo, si engendro un ERlang REPL en este script bash, ¿se impondrá el límite de memoria?
Christophe De Troyer
2
@ChristopheDeTroyer El límite será heredado por los procesos secundarios, por lo que los procesos secundarios no pueden exceder eso. Pero este límite no se aplicará a todo el árbol de procesos.
dibujante