No estoy seguro de si esto responde a su pregunta, pero encontré este script de perl que dice hacer exactamente lo que está buscando. El script implementa su propio sistema para hacer cumplir los límites despertando y verificando el uso de recursos del proceso y sus hijos. Parece estar bien documentado y explicado, y ha sido actualizado recientemente.
Como dijo slm en su comentario, cgroups también se puede usar para esto. Es posible que deba instalar las utilidades para administrar cgroups, suponiendo que esté en Linux, debe buscar libcgroups
.
sudo cgcreate -t $USER:$USER -a $USER:$USER -g memory:myGroup
Asegúrate de $USER
es su usuario.
Su usuario debería tener acceso a la configuración de memoria de cgroup en /sys/fs/cgroup/memory/myGroup
.
Luego puede establecer el límite en, digamos, 500 MB, haciendo esto:
echo 500000000 > /sys/fs/cgroup/memory/myGroup/memory.limit_in_bytes
Ahora ejecutemos Vim:
cgexec -g memory:myGroup vim
El proceso vim y todos sus elementos secundarios ahora deberían limitarse a usar 500 MB de RAM. Sin embargo , creo que este límite solo se aplica a la memoria RAM y no al intercambio. Una vez que los procesos alcancen el límite, comenzarán a intercambiarse. No estoy seguro de si puede solucionar esto, no puedo encontrar una manera de limitar el uso de intercambio usando cgroups.
https://unix.stackexchange.com/a/536046/4319:
En cualquier distribución basada en systemd, también puede usar cgroups indirectamente a través de systemd-run. P.ej. para su caso de limitar pdftoppm
a 500M de RAM, usa:
systemd-run --scope -p MemoryLimit=500M pdftoppm
...
Creé un script que hace esto, usando cgmanager que se usa en Ubuntu. Una ventaja es que esto no requiere acceso de root. Tenga en cuenta que la administración de cgroup es un poco específica de la distribución, por lo que no sé si esto funciona en las distribuciones que usan systemd cgroup management.
#!/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
uso:guardar como limitmem
en su camino y hacerlo ejecutable. Luego ejecute, p. limitmem 1G command...
. Esto limita la memoria realmente utilizada. Si se llega a eso, el asesino OOM matará el proceso o uno de sus hijos, pero no algo aleatorio que no tenga nada que ver con este comando.