Saya menjalankan pdftoppm
untuk mengonversi PDF yang disediakan pengguna menjadi gambar 300DPI. Ini berfungsi dengan baik, kecuali jika pengguna menyediakan PDF dengan ukuran halaman yang sangat besar. pdftoppm
akan mengalokasikan cukup memori untuk menyimpan gambar 300DPI dengan ukuran tersebut di memori, yang untuk halaman persegi 100 inci adalah 100*300 * 100*300 * 4 byte per piksel =3,5 GB. Seorang pengguna jahat bisa saja memberi saya PDF berukuran besar yang konyol dan menyebabkan segala macam masalah.
Jadi yang ingin saya lakukan adalah membatasi penggunaan memori untuk proses anak yang akan saya jalankan – biarkan prosesnya mati jika mencoba mengalokasikan lebih dari, katakanlah, memori 500MB. Apakah itu mungkin?
Saya tidak berpikir ulimit dapat digunakan untuk ini, tetapi apakah ada satu proses yang setara?
Jawaban yang Diterima:
Ada beberapa masalah dengan ulimit. Berikut adalah bacaan yang berguna tentang topik ini:Membatasi waktu dan konsumsi memori program di Linux, yang mengarah ke alat batas waktu, yang memungkinkan Anda mengurung proses (dan garpunya) berdasarkan waktu atau konsumsi memori.
Alat batas waktu membutuhkan Perl 5+ dan /proc
sistem file terpasang. Setelah itu Anda menyalin alat ke mis. /usr/local/bin
seperti ini:
curl https://raw.githubusercontent.com/pshved/timeout/master/timeout |
sudo tee /usr/local/bin/timeout && sudo chmod 755 /usr/local/bin/timeout
Setelah itu, Anda dapat 'menahan' proses Anda dengan konsumsi memori seperti pada pertanyaan Anda seperti ini:
timeout -m 500 pdftoppm Sample.pdf
Atau Anda bisa menggunakan -t <seconds>
dan -x <hertz>
untuk masing-masing membatasi proses dengan batasan waktu atau CPU.
Cara kerja alat ini adalah dengan memeriksa beberapa kali per detik jika proses spawned belum melampaui batas yang ditetapkan. Ini berarti sebenarnya ada jendela kecil di mana suatu proses berpotensi menjadi kelebihan langganan sebelum pemberitahuan batas waktu dan menghentikan prosesnya.
Oleh karena itu, pendekatan yang lebih tepat kemungkinan akan melibatkan cgroups, tetapi itu jauh lebih terlibat dalam penyiapan, bahkan jika Anda menggunakan Docker atau runC, yang antara lain, menawarkan abstraksi yang lebih ramah pengguna seputar cgroups.