Lancé una aplicación de servidor y quiero ejecutarla durante mucho tiempo con fines de prueba. Desafortunadamente, olvidé configurar antes ulimit -c unlimitedpara detectar un posible bloqueo e inspeccionarlo. ¿Hay algo que pueda hacer?
En versiones recientes de Linux (desde 2.6.36), puede usar el prlimitcomando 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 gdby emitir setrlimitdesde 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 4en Linux en x86-64). Para "ilimitado", use RLIM_INFINITY, por lo general -1. Debe verificar /usr/include/bits/types.hcuá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).
gdbté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, lasetrlimitllamada devuelve -1 y errno es 22 (argumento no válido).Como Ubuntu 14.04 Trusty no tiene util-linux-2.21 (es 2.20), no hay un
prlimitcomando 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:
O más detallado:
Verifique que funcione:
Tenga en cuenta que esto funciona con Linux 2.6.36 o posterior con glibc 2.13 o posterior.
fuente