In neueren Linux-Versionen (seit 2.6.36) können Sie mithilfe des prlimit
Befehls und des Systemaufrufs Ressourcenbeschränkungen für einen beliebigen Prozess festlegen (bei entsprechenden Berechtigungen):
$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION SOFT HARD UNITS
CORE max core file size unlimited unlimited blocks
Sie benötigen util-linux-2.21 für den Befehl prlimit, sollten aber in der Lage sein, ein schnelles Programm zusammenzustellen, um den Systemaufruf prlimit aufzurufen. Andernfalls:
int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);
Wenn Sie nicht über eine ausreichend neue Version von Linux (oder einem anderen Betriebssystem) verfügen, ist das einzige gdb
Problem, setrlimit
das mir bekannt ist, die Verbindung zum Prozess mit dem Debugger herzustellen und dieses Problem zu beheben :
$ gdb -p $PID
...
(gdb) set $rlim = &{0ll, 0ll}
(gdb) print getrlimit(9, $rlim)
$1 = 0
(gdb) print *$rlim
$2 = {-1, -1}
(gdb) set *$rlim[0] = 1024*1024
(gdb) print setrlimit(9, $rlim)
$3 = 0
Dies ist für die Einstellung ulimit -m
, RLIMIT_AS = 9
; genau das gleiche gilt für ulimit -c
( RLIMIT_CORE
, numerischer Wert 4
unter Linux auf x86-64). Verwenden Sie für "unbegrenzt" RLIM_INFINITY
in der Regel -1
. Sie sollten überprüfen, /usr/include/bits/types.h
wie groß diese rlim_t
ist. Ich gehe davon aus long long
(es ist eigentlich ohne Vorzeichen, aber die Verwendung eines vorzeichenbehafteten Typs macht "unbegrenzt" -1 leichter lesbar).
gdb
Technik ist wirklich cool. Eine Einschränkung ist, dass Sie die Anzahl der geöffneten Dateien für einen Nicht-Root-Prozess nicht über das harte Limit hinaus erhöhen können. Dersetrlimit
Aufruf gibt -1 zurück und errno ist 22 (ungültiges Argument).