Я запустил серверное приложение и хочу долго его запускать в целях тестирования. К сожалению, я забыл установить перед ulimit -c unlimited
тем, как поймать возможный сбой и осмотреть его. Есть ли что-то, что я могу сделать?
В последних версиях 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).
gdb
Техника действительно классная. Одно предостережение: кажется, вы не можете увеличить количество открытых файлов для процесса без полномочий root после его жесткого ограничения,setrlimit
вызов возвращает -1, а значение errno равно 22 (неверный аргумент).Поскольку в Ubuntu 14.04 Trusty нет util-linux-2.21 (это 2.20), нет
prlimit
команды CLI для использования.Использование Python3.4 + (которое доступно в Ubuntu 14.04 и всех более поздних версиях) может установить ограничение ресурсов для запущенного процесса. Запустите с правами root:
1-вкладыш:
Или более многословно:
Убедитесь, что это работает:
Обратите внимание, что это работает с Linux 2.6.36 или новее с glibc 2.13 или новее.
источник