configuração ulimit em um processo em execução

23

Eu iniciei um aplicativo de servidor e quero executá-lo por um longo tempo para fins de teste. Infelizmente, esqueci de definir antes de ulimit -c unlimited para pegar uma eventual falha e inspecioná-la. Existe algo que eu possa fazer?

    
por Lorenzo Pistone 24.03.2012 / 09:25

2 respostas

37

Em versões recentes do Linux (desde 2.6.36), você pode usar o prlimit comando e chamada de sistema para definir limites de recursos em um processo arbitrário (dadas 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 você deve ser capaz de juntar um programa rápido para invocar o 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 tiver uma versão nova o suficiente do Linux (ou de outro SO), a única correção que conheço é conectar-se ao processo com gdb e emitir setrlimit 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

Isso é para definir 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 em /usr/include/bits/types.h qual é o tamanho de rlim_t ; Estou assumindo long long (na verdade não assinada, mas usar um tipo assinado torna "ilimitado" -1 mais fácil de ler).

    
por 26.06.2012 / 16:32
1

Como o Ubuntu 14.04 Trusty não possui o util-linux-2.21 (é 2.20), não há nenhum comando prlimit da CLI para usar.

Usando Python3.4 + (que está disponível no Ubuntu 14.04 e mais tarde versões) 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 o glibc 2.13 ou posterior.

    
por 23.06.2018 / 06:32

Tags