Как наложить ограничения памяти на сценарий оболочки?

10

У меня есть сценарий PHP, который, хотя папка содержит файлы XML, будет обрабатывать их в базе данных.

В настоящее время сервер работает под управлением PHP версии 5.3.10, и в нем содержится отчет об ошибках памяти, возникающих ZEND_MM_HEAPв цикле.

Это приводит к тому, что PHP не освобождает память должным образом, что приводит к ошибке и падению скрипта:

 zend_mm_heap is corrupted

Некоторые решения найдены, но у меня нет доступа к настройкам сервера.

Чтобы справиться с этим, я подготовил следующий скрипт bash, чтобы позаботиться о цикле, оставив PHP-скрипт ответственным только за обработку 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

Теперь моя цель - ограничить выделение памяти для bash (память и виртуальная память), предотвращая зависание системы, если что-то пойдет не так.

Мой вопрос:
как я могу ограничить объем памяти, используемой этим сценарием оболочки, до определенного количества?

Zuul
источник
1
Пожалуйста, обратите внимание, что вы можете изменить способ выделения памяти, запустив export USE_ZEND_ALLOC=0.
Педро Кордейру

Ответы:

12

Вы можете ограничить использование памяти с помощью Bash Script, выполнив следующие действия.

Ограничьте использование памяти килобайтами (в данном примере 2 ГБ):

ulimit -m 2048000

Ограничить использование виртуальной памяти:

ulimit -v 2048000

Установите ограничение виртуальной памяти равным жесткому ограничению, чтобы при превышении этого предела процесс прерывался:

ulimit -H -v

Я думаю, что это может делать то, что вы хотите.

Октавио Филипе Гонсалвес
источник
1
Этот лимит также учитывается для дочерних процессов? Например, если я вызову erlang REPL в этом скрипте bash, будет ли введен лимит памяти?
Кристоф Де Тройер
2
@ChristopheDeTroyer Предел будет наследоваться дочерними процессами, поэтому дочерние процессы не могут его превышать. Но этот предел не будет применяться ко всему дереву процессов.
карикатурист