définir ulimit sur un processus en cours

25

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 unlimitedd'attraper un éventuel crash et de l'inspecter. Puis-je faire quelque chose?

Lorenzo Pistone
la source

Réponses:

39

Sur les versions récentes de Linux (depuis 2.6.36), vous pouvez utiliser la prlimitcommande 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 gdbet setrlimitde 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 4sous Linux sur x86-64). Pour "illimité", utilisez RLIM_INFINITYgénéralement -1. Vous devez vérifier /usr/include/bits/types.hquelle 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).

ecatmur
la source
+1 La gdbtechnique 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' setrlimitappel renvoie -1 et errno est 22 (argument non valide).
Steve Kehlet
2

Comme Ubuntu 14.04 Trusty n'a pas util-linux-2.21 (c'est 2.20), il n'y a pas de prlimitcommande 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.

HVNSweeting
la source