встановлення ulimit на запущеному процесі


25

Я запустив серверну програму і хочу запускати її тривалий час для тестування. На жаль, я забув встановити раніше, ulimit -c unlimitedщоб спіймати можливий збій та перевірити його. Чи можна щось зробити?

Відповіді:


39

В останніх версіях 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

Для команди prlimit вам потрібен util-linux-2.21, але ви повинні мати можливість зібрати швидку програму, щоб викликати виклик системи 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 легше читати).


+1 gdbТехніка дійсно класна. З одного застереження, здається, ви не можете збільшити кількість відкритих файлів для некореневого процесу, що перевищує його жорсткий ліміт, setrlimitвиклик повертає -1, а errno - 22 (недійсний аргумент).
Стів Келет

2

Оскільки Ubuntu 14.04 Trusty не має util-linux-2.21 (це 2.20), не існує prlimitкоманди CLI для використання.

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

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 або новішою версією.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.