Ich bin mir nicht sicher, ob dies Ihre Frage beantwortet, aber ich habe dieses Perl-Skript gefunden, das behauptet, genau das zu tun, wonach Sie suchen. Das Skript implementiert sein eigenes System zur Durchsetzung der Grenzen, indem es den Ressourcenverbrauch des Prozesses und seiner untergeordneten Prozesse aufweckt und überprüft. Es scheint gut dokumentiert und erklärt zu sein und wurde kürzlich aktualisiert.
Wie slm in seinem Kommentar sagte, können dafür auch cgroups verwendet werden. Möglicherweise müssen Sie die Dienstprogramme zum Verwalten von Cgroups installieren, vorausgesetzt, Sie verwenden Linux, und Sie sollten nach libcgroups
suchen .
sudo cgcreate -t $USER:$USER -a $USER:$USER -g memory:myGroup
Stellen Sie sicher, dass $USER
ist Ihr Benutzer.
Ihr Benutzer sollte dann Zugriff auf die Cgroup-Speichereinstellungen in /sys/fs/cgroup/memory/myGroup
haben .
Sie können dann das Limit auf beispielsweise 500 MB festlegen, indem Sie Folgendes tun:
echo 500000000 > /sys/fs/cgroup/memory/myGroup/memory.limit_in_bytes
Lassen Sie uns nun Vim ausführen:
cgexec -g memory:myGroup vim
Der vim-Prozess und alle seine Kinder sollten jetzt auf die Verwendung von 500 MB RAM beschränkt sein. Allerdings , ich denke, diese Grenze gilt nur für RAM und nicht für Swap. Sobald die Prozesse das Limit erreichen, beginnen sie mit dem Austausch. Ich bin mir nicht sicher, ob Sie dies umgehen können, ich kann keine Möglichkeit finden, die Swap-Nutzung mithilfe von cgroups einzuschränken.
https://unix.stackexchange.com/a/536046/4319:
Auf jeder systemd-basierten Distribution können Sie cgroups auch indirekt über systemd-run verwenden. Z.B. für Ihren Fall der Begrenzung von pdftoppm
bis 500 MB RAM, verwenden Sie:
systemd-run --scope -p MemoryLimit=500M pdftoppm
...
Ich habe ein Skript erstellt, das dies tut, indem ich cgmanager verwende, der in Ubuntu verwendet wird. Ein Vorteil ist, dass hierfür kein Root-Zugriff erforderlich ist. Beachten Sie, dass die Cgroup-Verwaltung ein wenig Distributions-spezifisch ist, daher weiß ich nicht, ob dies bei Distributionen funktioniert, die systemd Cgroup-Verwaltung verwenden.
#!/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
Verwendung:Speichern unter limitmem
in Ihren Pfad und machen Sie es ausführbar. Dann laufe z.B. limitmem 1G command...
. Diese begrenzen den tatsächlich genutzten Speicher. Wenn das erreicht ist, wird der OOM-Killer den Prozess oder eines seiner Kinder töten, aber nichts Zufälliges, das nichts mit diesem Befehl zu tun hat.