web-dev-qa-db-fra.com

paramétrer ulimit sur un processus en cours

J'ai lancé une application serveur et je souhaite l'exécuter pendant longtemps à des fins de test. Malheureusement, j’ai oublié de configurer avant ulimit -c unlimited pour détecter un éventuel crash et l’inspecter. Est-ce que je peux faire quelque chose?

25
Lorenzo Pistone

Sur les versions récentes de Linux (depuis la version 2.6.36), vous pouvez utiliser la commande et l’appel système prlimit pour définir des limites de ressources pour un processus arbitraire autorisations):

$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION             SOFT      HARD UNITS
CORE     max core file size unlimited unlimited blocks

Vous avez besoin de util-linux-2.21 pour la commande prlimit, mais vous devriez être capable de créer un programme rapide permettant d'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 de Linux (ou d'un autre système d'exploitation), le seul problème que je connaisse consiste à vous connecter au processus avec gdb et à émettre setrlimit à partir 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 régler ulimit -m, RLIMIT_AS = 9; il en va de même pour ulimit -c (RLIMIT_CORE, valeur numérique 4 sous Linux sous x86-64). Pour "illimité", utilisez RLIM_INFINITY, généralement -1. Vous devriez vérifier /usr/include/bits/types.h quelle est la taille de rlim_t; Je suppose que long long (c'est en fait non signé, mais utiliser un type signé rend "illimité" -1 plus facile à lire).

39
ecatmur

Comme Ubuntu 14.04 Trusty n’a pas util-linux-2.21 (c’est 2.20), il n’ya pas de commande CLI prlimit à utiliser.

L'utilisation de Python3.4 + (disponible sur Ubuntu 14.04 et toutes les versions ultérieures) permet de 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.

2
HVNSweeting