Setzen von ulimit auf einen laufenden Prozess

25

Ich habe eine Serveranwendung gestartet und möchte sie zu Testzwecken über einen längeren Zeitraum ausführen. Leider habe ich vergessen, vorher einzustellen ulimit -c unlimited, um einen eventuellen Absturz zu fangen und ihn zu inspizieren. Kann ich etwas tun?

Lorenzo Pistone
quelle

Antworten:

39

In neueren Linux-Versionen (seit 2.6.36) können Sie mithilfe des prlimitBefehls 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 gdbProblem, setrlimitdas 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 4unter Linux auf x86-64). Verwenden Sie für "unbegrenzt" RLIM_INFINITYin der Regel -1. Sie sollten überprüfen, /usr/include/bits/types.hwie groß diese rlim_tist. Ich gehe davon aus long long(es ist eigentlich ohne Vorzeichen, aber die Verwendung eines vorzeichenbehafteten Typs macht "unbegrenzt" -1 leichter lesbar).

ecatmur
quelle
+1 Die gdbTechnik 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. Der setrlimitAufruf gibt -1 zurück und errno ist 22 (ungültiges Argument).
Steve Kehlet
2

Da Ubuntu 14.04 Trusty kein util-linux-2.21 hat (es ist 2.20), muss kein prlimitCLI-Befehl verwendet werden.

Mit Python3.4 + (verfügbar unter Ubuntu 14.04 und allen neueren Versionen) können Sie ein Ressourcenlimit für einen laufenden Prozess festlegen. Als root ausführen:

1 Liner:

# PID=966
# grep 'open file' /proc/$PID/limits
Max open files            1024                 4096                 files     
# python3 -c "import resource; resource.prlimit($PID, resource.RLIMIT_NOFILE, (2048, 12345))"
# grep 'open file' /proc/$PID/limits
Max open files            2048                 12345                files   

Oder ausführlicher:

# python3
Python 3.4.3 (default, Nov 28 2017, 16:41:13) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import resource
>>> import os
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE)
(1024, 4096)
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE, (1369, 9999))
(1024, 4096)
>>> resource.prlimit(os.getpid(), resource.RLIMIT_NOFILE)
(1369, 9999)

Überprüfen Sie, ob es funktioniert:

# grep 'open file' /proc/1472/limits 
Max open files            1369                 9999                 files 

Beachten Sie, dass dies mit Linux 2.6.36 oder höher mit glibc 2.13 oder höher funktioniert.

HVNSweeting
quelle