Установка ulimit на работающий процесс

Я запустил серверное приложение и хочу долго его запускать в целях тестирования. К сожалению, я забыл установить раньше ulimit -c unlimited чтобы поймать возможную аварию и осмотреть ее. Есть ли что-то, что я могу сделать?

2 ответа

Решение

В последних версиях Linux (начиная с 2.6.36) вы можете использовать prlimit команда и системный вызов для установки ограничений ресурсов для произвольного процесса (при наличии соответствующих разрешений):

$ prlimit --core=unlimited: --pid $$
$ prlimit --core --pid $$
RESOURCE DESCRIPTION             SOFT      HARD UNITS
CORE     max core file size unlimited unlimited blocks

Вам нужен util-linux-2.21 для команды prlimit, но вы должны иметь возможность собрать быструю программу для вызова системного вызова prlimit в противном случае:

int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit);

Если у вас недостаточно новой версии Linux (или другой ОС), единственное известное мне исправление - это подключиться к процессу с gdb и выпустить setrlimit из отладчика:

$ 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

Это для настройки ulimit -m, RLIMIT_AS = 9; точно так же относится к ulimit -c (RLIMIT_CORE, числовое значение 4 в Linux на x86-64). Для "безлимитный" используйте RLIM_INFINITY, обычно -1, Вы должны проверить в /usr/include/bits/types.h какой размер rlim_t является; Я предполагаю, что long long (это на самом деле без знака, но использование типа со знаком делает "неограниченное" -1 более легким для чтения).

Поскольку в Ubuntu 14.04 Trusty нет util-linux-2.21 (это 2.20), prlimit Команда CLI для использования.

Использование Python3.4+ (которое доступно в Ubuntu 14.04 и всех более поздних версиях) может установить ограничение ресурсов для запущенного процесса. Запустите с правами root:

1-вкладыш:

# 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   

Или более многословно:

# 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)

Убедитесь, что это работает:

# grep 'open file' /proc/1472/limits 
Max open files            1369                 9999                 files 

Обратите внимание, что это работает с Linux 2.6.36 или новее с glibc 2.13 или новее.

Другие вопросы по тегам