Bagaimana cara memaksakan batas memori pada skrip shell?

10

Saya memiliki skrip PHP yang, sementara folder berisi file XML, akan memprosesnya ke dalam basis data.

Saat ini, server menjalankan PHP versi 5.3.10 dan ada laporan bug tentang masalah memori yang dipicu oleh ZEND_MM_HEAPdalam satu lingkaran.

Hal ini menyebabkan PHP tidak membebaskan memori dengan benar, sehingga menyebabkan kesalahan dan skrip macet:

 zend_mm_heap is corrupted

Beberapa solusi ditemukan, tetapi saya tidak memiliki akses ke pengaturan server.

Untuk mengatasinya, saya telah menyiapkan skrip bash berikut untuk menangani perulangan, membiarkan skrip PHP hanya bertanggung jawab dengan memroses 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

Tujuan saya sekarang adalah memiliki alokasi memori bash ini terbatas (memori dan memori virtual), sehingga mencegahnya untuk menggantung sistem jika terjadi kesalahan.

Pertanyaan saya adalah:
Bagaimana saya bisa membatasi memori yang digunakan oleh skrip shell ini ke jumlah tertentu?

Zuul
sumber
1
Harap dicatat bahwa Anda dapat menggunakan mengubah cara memori dialokasikan, dengan menjalankan export USE_ZEND_ALLOC=0.
Pedro Cordeiro

Jawaban:

12

Anda dapat membatasi penggunaan memori dengan Bash Script, melakukan yang berikut.

Batasi penggunaan memori oleh kb (2GB dalam contoh ini):

ulimit -m 2048000

Batasi penggunaan memori virtual:

ulimit -v 2048000

Tetapkan batas memori virtual menjadi batas keras, sehingga proses itu akan mati ketika melebihi batas ini:

ulimit -H -v

Saya pikir ini dapat melakukan apa yang Anda inginkan.

Octávio Filipe Gonçalves
sumber
1
Apakah batasan ini juga dihitung untuk proses anak? Misalnya, jika saya menelurkan erlang REPL di skrip bash ini, apakah batas memori akan dikenakan?
Christophe De Troyer
2
@ChristopheDeTroyer Batas akan diwarisi oleh proses anak, sehingga proses anak tidak dapat melebihi itu. Tetapi batas ini tidak akan diterapkan ke semua pohon proses.
kartunis