Saya tidak yakin apakah ini menjawab pertanyaan Anda, tetapi saya menemukan skrip perl ini yang mengklaim melakukan apa yang Anda cari. Skrip mengimplementasikan sistemnya sendiri untuk menegakkan batasan dengan membangunkan dan memeriksa penggunaan sumber daya dari proses dan anak-anaknya. Tampaknya didokumentasikan dan dijelaskan dengan baik, dan telah diperbarui baru-baru ini.
Seperti yang dikatakan slm dalam komentarnya, cgroup juga dapat digunakan untuk ini. Anda mungkin harus menginstal utilitas untuk mengelola cgroup, dengan asumsi Anda menggunakan Linux, Anda harus mencari libcgroups
.
sudo cgcreate -t $USER:$USER -a $USER:$USER -g memory:myGroup
Pastikan $USER
adalah pengguna Anda.
Pengguna Anda kemudian harus memiliki akses ke pengaturan memori cgroup di /sys/fs/cgroup/memory/myGroup
.
Anda kemudian dapat menetapkan batas, katakanlah 500 MB, dengan melakukan ini:
echo 500000000 > /sys/fs/cgroup/memory/myGroup/memory.limit_in_bytes
Sekarang mari jalankan Vim:
cgexec -g memory:myGroup vim
Proses vim dan semua turunannya sekarang harus dibatasi untuk menggunakan RAM 500 MB. Namun , menurut saya batasan ini hanya berlaku untuk RAM dan bukan swap. Setelah proses mencapai batas, mereka akan mulai bertukar. Saya tidak yakin apakah Anda dapat menyiasatinya, saya tidak dapat menemukan cara untuk membatasi penggunaan swap menggunakan cgroups.
https://unix.stackexchange.com/a/536046/4319:
Pada distro berbasis systemd apa pun, Anda juga dapat menggunakan cgroups secara tidak langsung melalui systemd-run. Misalnya. untuk kasus Anda membatasi pdftoppm
hingga 500M RAM, gunakan:
systemd-run --scope -p MemoryLimit=500M pdftoppm
...
Saya membuat skrip yang melakukan ini, menggunakan cgmanager yang digunakan di Ubuntu. Salah satu keuntungannya adalah ini tidak memerlukan akses root. Perhatikan bahwa manajemen cgroup agak spesifik untuk distro, jadi saya tidak tahu apakah ini berfungsi pada distro yang menggunakan manajemen cgroup systemd.
#!/bin/sh
set -eu
if [ "$#" -lt 2 ]
then
echo Usage: `basename $0` "<limit> <command>..."
exit 1
fi
limit="$1"
shift
cgname="limitmem_$$"
echo "limiting memory to $limit (cgroup $cgname) for command [email protected]"
cgm create memory "$cgname" >/dev/null
cgm setvalue memory "$cgname" memory.limit_in_bytes "$limit" >/dev/null
# try also limiting swap usage, but this fails if the system has no swap
cgm setvalue memory "$cgname" memsw.limit_in_bytes "$limit" >/dev/null 2>&1 || true
# spawn subshell to run in the cgroup
set +e
(
set -e
cgm movepid memory "$cgname" `sh -c 'echo $PPID'` > /dev/null
exec "[email protected]"
)
# grab exit code
exitcode=`echo $?`
set -e
echo -n "peak memory used: "
cgm getvalue memory "$cgname" memory.max_usage_in_bytes | tail -1 | cut -f2 -d\"
cgm remove memory "$cgname" >/dev/null
exit $exitcode
penggunaan:simpan sebagai limitmem
di jalur Anda dan membuatnya dapat dieksekusi. Kemudian jalankan mis. limitmem 1G command...
. Ini membatasi memori yang sebenarnya digunakan. Jika itu tercapai, pembunuh OOM akan mematikan proses atau salah satu anaknya, tetapi bukan sesuatu yang acak yang tidak ada hubungannya dengan perintah ini.