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?
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).
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.