Lancé una aplicación de servidor y quiero ejecutarla durante mucho tiempo con fines de prueba. Desafortunadamente, olvidé configurar antes ulimit -c unlimited
para detectar un posible bloqueo e inspeccionarlo. ¿Hay algo que pueda hacer?
Lancé una aplicación de servidor y quiero ejecutarla durante mucho tiempo con fines de prueba. Desafortunadamente, olvidé configurar antes ulimit -c unlimited
para detectar un posible bloqueo e inspeccionarlo. ¿Hay algo que pueda hacer?
Respuestas:
En versiones recientes de Linux (desde 2.6.36), puede usar el prlimit
comando y la llamada al sistema para establecer límites de recursos en un proceso arbitrario (con los permisos apropiados):
$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION SOFT HARD UNITS
CORE max core file size unlimited unlimited blocks
Necesita util-linux-2.21 para el comando prlimit, pero debería poder armar un programa rápido para invocar la llamada al sistema prlimit de lo contrario:
int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);
Si no tiene una versión suficientemente nueva de Linux (u otro sistema operativo), la única solución que conozco es conectarse al proceso gdb
y emitir setrlimit
desde el 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
Esto es para el ajuste ulimit -m
, RLIMIT_AS = 9
; exactamente lo mismo se aplica para ulimit -c
( RLIMIT_CORE
, valor numérico 4
en Linux en x86-64). Para "ilimitado", use RLIM_INFINITY
, por lo general -1
. Debe verificar /usr/include/bits/types.h
cuál es el tamaño de rlim_t
; Supongo long long
(en realidad no está firmado, pero usar un tipo con signo hace que "ilimitado" -1 sea más fácil de leer).
Como Ubuntu 14.04 Trusty no tiene util-linux-2.21 (es 2.20), no hay un prlimit
comando CLI para usar.
El uso de Python3.4 + (que está disponible en Ubuntu 14.04 y todas las versiones posteriores) puede establecer el límite de recursos para un proceso en ejecución. Ejecutar 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
O más detallado:
# 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 que funcione:
# grep 'open file' /proc/1472/limits
Max open files 1369 9999 files
Tenga en cuenta que esto funciona con Linux 2.6.36 o posterior con glibc 2.13 o posterior.
gdb
técnica es realmente genial. Una advertencia, parece que no puede aumentar el número de archivos abiertos para un proceso no root más allá de su límite rígido, lasetrlimit
llamada devuelve -1 y errno es 22 (argumento no válido).