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?
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).
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).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:
Ou plus verbeux:
Vérifiez que cela fonctionne:
Notez que cela fonctionne avec Linux 2.6.36 ou version ultérieure avec glibc 2.13 ou version ultérieure.
la source