Wie kann man einem Shell-Skript Speicherbeschränkungen auferlegen?

10

Ich habe ein PHP-Skript, das, obwohl ein Ordner XML-Dateien enthält, diese in der Datenbank verarbeitet.

Derzeit läuft auf dem Server PHP Version 5.3.10 und es gibt einen Fehlerbericht über Speicherprobleme, die ZEND_MM_HEAPinnerhalb einer Schleife ausgelöst werden .

Dies führt dazu, dass PHP den Speicher nicht ordnungsgemäß freigibt, was zu einem Fehler und einem Skriptabsturz führt:

 zend_mm_heap is corrupted

Einige Lösungen wurden gefunden, aber ich habe keinen Zugriff auf die Servereinstellungen.

Um dies zu bewältigen, habe ich das folgende Bash-Skript vorbereitet, um die Schleife zu behandeln, wobei das PHP-Skript nur für die Verarbeitung der XML-Datei verantwortlich ist:

#!/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

Mein Ziel ist es nun, diese Bash-Speicherzuordnung zu begrenzen (Speicher und virtueller Speicher), um zu verhindern, dass das System hängen bleibt, wenn etwas schief geht.

Meine Frage lautet:
Wie kann ich den von diesem Shell-Skript verwendeten Speicher auf eine bestimmte Menge beschränken?

Zuul
quelle
1
Bitte beachten Sie, dass Sie die Art und Weise, wie der Speicher zugewiesen wird, durch Ausführen ändern können export USE_ZEND_ALLOC=0.
Pedro Cordeiro

Antworten:

12

Sie können die Speichernutzung durch ein Bash-Skript einschränken, indem Sie die folgenden Schritte ausführen.

Begrenzen Sie die Speichernutzung um KB (in diesem Beispiel 2 GB):

ulimit -m 2048000

Beschränken Sie die Nutzung des virtuellen Speichers:

ulimit -v 2048000

Setzen Sie das Limit für den virtuellen Speicher auf ein hartes Limit, damit der Prozess abgebrochen wird, wenn dieses Limit überschritten wird:

ulimit -H -v

Ich denke, das kann machen, was du willst.

Octávio Filipe Gonçalves
quelle
1
Zählt dieses Limit auch für untergeordnete Prozesse? Wenn ich beispielsweise in diesem Bash-Skript eine erlang REPL spawne, wird dann das Speicherlimit festgelegt?
Christophe De Troyer
2
@ChristopheDeTroyer Das Limit wird von untergeordneten Prozessen geerbt, sodass die untergeordneten Prozesse diesen Wert nicht überschreiten können. Diese Grenze wird jedoch nicht auf alle Prozessbäume angewendet.
Karikaturist