Lancei um aplicativo de servidor e quero executá-lo por um longo tempo para fins de teste. Infelizmente, eu esqueci de definir antes ulimit -c unlimited
para pegar um eventual acidente e inspecioná-lo. Existe algo que eu possa fazer?
Lancei um aplicativo de servidor e quero executá-lo por um longo tempo para fins de teste. Infelizmente, eu esqueci de definir antes ulimit -c unlimited
para pegar um eventual acidente e inspecioná-lo. Existe algo que eu possa fazer?
Respostas:
Nas versões recentes do Linux (desde 2.6.36), você pode usar a prlimit
chamada de comando e sistema para definir limites de recursos em um processo arbitrário (com as permissões apropriadas):
$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION SOFT HARD UNITS
CORE max core file size unlimited unlimited blocks
Você precisa do util-linux-2.21 para o comando prlimit, mas deve poder reunir um programa rápido para chamar a chamada do sistema prlimit, caso contrário:
int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);
Se você não possui uma versão nova o suficiente do Linux (ou outro sistema operacional), a única correção que tenho conhecimento é conectar-se ao processo gdb
e emitir a setrlimit
partir do depurador:
$ 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
Isto é para configuração ulimit -m
, RLIMIT_AS = 9
; exatamente o mesmo se aplica a ulimit -c
( RLIMIT_CORE
, valor numérico 4
no Linux em x86-64). Para "ilimitado", use RLIM_INFINITY
, geralmente -1
. Você deve verificar /usr/include/bits/types.h
qual é o tamanho de rlim_t
; Estou assumindo long long
(na verdade, não está assinado, mas o uso de um tipo assinado torna "ilimitado" -1 mais fácil de ler).
Como o Ubuntu 14.04 Trusty não possui util-linux-2.21 (é 2.20), não há prlimit
comando de CLI para usar.
O uso do Python3.4 + (disponível no Ubuntu 14.04 e em todas as versões posteriores) pode definir o limite de recursos para um processo em execução. Executar como root:
1-liner:
# 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 mais detalhado:
# 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)
Verifique se funciona:
# grep 'open file' /proc/1472/limits
Max open files 1369 9999 files
Observe que isso funciona com o Linux 2.6.36 ou posterior com glibc 2.13 ou posterior.
gdb
técnica é muito legal. Uma ressalva: parece que você não pode aumentar o número de arquivos abertos para um processo não raiz além do limite rígido, asetrlimit
chamada retorna -1 e errno é 22 (argumento inválido).