Come imporre limiti di memoria su uno script di shell?


10

Ho uno script PHP che, mentre una cartella contiene file XML, li elaborerà nel database.

Attualmente, il server esegue PHP versione 5.3.10 e c'è una segnalazione di bug su problemi di memoria innescati da ZEND_MM_HEAPun ciclo.

Questo fa sì che il PHP non liberi correttamente la memoria, causando così un errore e un arresto anomalo dello script:

 zend_mm_heap is corrupted

Sono state trovate alcune soluzioni , ma non ho accesso alle impostazioni del server.

Per far fronte a questo, ho preparato il seguente script bash per occuparmi del ciclo, lasciando lo script PHP responsabile solo elaborando il file 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

Il mio obiettivo ora è avere questa allocazione di memoria bash limitata (memoria e memoria virtuale), impedendo così di bloccare il sistema se qualcosa va storto.

La mia domanda è:
come posso limitare la memoria utilizzata da questo script di shell a un importo specifico?


1
Si noti che è possibile utilizzare modificare il modo in cui viene allocata la memoria, eseguendo export USE_ZEND_ALLOC=0.
Pedro Cordeiro,

Risposte:


12

È possibile limitare l'utilizzo della memoria tramite uno script Bash, procedendo come segue.

Limita l'utilizzo della memoria di kb (2 GB in questo esempio):

ulimit -m 2048000

Limitare l'utilizzo della memoria virtuale:

ulimit -v 2048000

Impostare il limite di memoria virtuale su limite rigido, in modo che il processo venga interrotto quando si supera questo limite:

ulimit -H -v

Penso che questo possa fare quello che vuoi.


1
Questo limite vale anche per i processi figlio? Ad esempio, se ho generato un REPL erlang in questo script bash, verrà imposto il limite di memoria?
Christophe De Troyer,

2
@ChristopheDeTroyer Il limite sarà ereditato dai processi figlio, quindi i processi figlio non possono superare quello. Ma questo limite non verrà applicato a tutto l'albero dei processi.
vignettista
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.