J'ai lancé une application serveur et je souhaite l'exécuter pendant longtemps à des fins de test. Malheureusement, j'ai oublié de régler avant ulimit -c unlimited
d'attraper un éventuel crash et de l'inspecter. Puis-je faire quelque chose?
J'ai lancé une application serveur et je souhaite l'exécuter pendant longtemps à des fins de test. Malheureusement, j'ai oublié de régler avant ulimit -c unlimited
d'attraper un éventuel crash et de l'inspecter. Puis-je faire quelque chose?
Réponses:
Sur les versions récentes de Linux (depuis 2.6.36), vous pouvez utiliser la prlimit
commande et l'appel système pour définir des limites de ressources sur un processus arbitraire (avec les autorisations appropriées):
$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION SOFT HARD UNITS
CORE max core file size unlimited unlimited blocks
Vous avez besoin d'util-linux-2.21 pour la commande prlimit, mais vous devriez pouvoir lancer un programme rapide pour appeler l' appel système prlimit sinon:
int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);
Si vous ne disposez pas d'une nouvelle version suffisante de Linux (ou d'un autre système d'exploitation), le seul correctif que je connaisse est de se connecter au processus avec gdb
et setrlimit
de sortir du débogueur:
$ 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
Ceci est pour le réglage ulimit -m
, RLIMIT_AS = 9
; exactement la même chose s'applique pour ulimit -c
( RLIMIT_CORE
, valeur numérique 4
sous Linux sur x86-64). Pour "illimité", utilisez RLIM_INFINITY
généralement -1
. Vous devez vérifier /usr/include/bits/types.h
quelle est la taille de rlim_t
; Je suppose long long
(c'est en fait non signé, mais l'utilisation d'un type signé rend "illimité" -1 plus facile à lire).
Comme Ubuntu 14.04 Trusty n'a pas util-linux-2.21 (c'est 2.20), il n'y a pas de prlimit
commande CLI à utiliser.
L'utilisation de Python3.4 + (disponible sur Ubuntu 14.04 et toutes les versions ultérieures) peut définir une limite de ressources pour un processus en cours d'exécution. Exécuter en tant que root:
1 doublure:
# 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
Ou plus verbeux:
# 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)
Vérifiez que cela fonctionne:
# grep 'open file' /proc/1472/limits
Max open files 1369 9999 files
Notez que cela fonctionne avec Linux 2.6.36 ou version ultérieure avec glibc 2.13 ou version ultérieure.
gdb
technique est vraiment cool. Une mise en garde, il semble que vous ne pouvez pas augmenter le nombre de fichiers ouverts pour un processus non root au- delà de sa limite stricte, l'setrlimit
appel renvoie -1 et errno est 22 (argument non valide).