Comment imposer des limites de mémoire à un script shell?

10

J'ai un script PHP qui, alors qu'un dossier contient des fichiers XML, les traitera dans la base de données.

Actuellement, le serveur exécute PHP version 5.3.10 et il y a un rapport de bogue sur les problèmes de mémoire déclenchés par ZEND_MM_HEAPune boucle.

Cela empêche le PHP de libérer de la mémoire correctement, ce qui entraîne une erreur et un crash de script:

 zend_mm_heap is corrupted

Certaines solutions sont trouvées, mais je n'ai pas accès aux paramètres du serveur.

Pour y faire face, j'ai préparé le script bash suivant pour prendre en charge la boucle, en laissant le script PHP uniquement responsable en traitant le fichier 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

Mon objectif est maintenant d'avoir cette allocation de mémoire bash limitée (mémoire et mémoire virtuelle), l'empêchant ainsi de bloquer le système en cas de problème.

Ma question est:
comment puis-je limiter la mémoire utilisée par ce script shell à une quantité spécifique?

Zuul
la source
1
Veuillez noter que vous pouvez utiliser changer la façon dont la mémoire est allouée, en exécutant export USE_ZEND_ALLOC=0.
Pedro Cordeiro

Réponses:

12

Vous pouvez limiter l'utilisation de la mémoire par un script Bash, en procédant comme suit.

Limitez l'utilisation de la mémoire par ko (2 Go dans cet exemple):

ulimit -m 2048000

Limitez l'utilisation de la mémoire virtuelle:

ulimit -v 2048000

Définissez la limite de mémoire virtuelle comme limite stricte, de sorte que le processus soit tué en cas de dépassement de cette limite:

ulimit -H -v

Je pense que cela peut faire ce que vous voulez.

Octávio Filipe Gonçalves
la source
1
Cette limite compte-t-elle également pour les processus enfants? Par exemple, si je crée un REPL erlang dans ce script bash, la limite de mémoire sera-t-elle imposée?
Christophe De Troyer
2
@ChristopheDeTroyer La limite sera héritée par les processus enfants, donc les processus enfants ne peuvent pas dépasser cela. Mais cette limite ne sera pas appliquée à tous les arbres de processus.
dessinateur