установить `ulimit -c` из внешней оболочки

У меня есть программа, которая запускается автоматически при загрузке и время от времени вызывает дамп ядра.

Я хотел бы записать вывод, но я не могу установить ulimit -c программно (по умолчанию он равен 0 и каждый раз сбрасывается).

Я пробовал использовать скрипт bash, а также sh, os.system и subprocess Python, но не могу заставить его работать.


person Jono    schedule 24.08.2014    source источник
comment
что произошло, когда вы попробовали подпроцесс?   -  person Padraic Cunningham    schedule 25.08.2014
comment
Вы добавили ulimit -c в сценарий запуска вашей программы?   -  person Cyrus    schedule 25.08.2014


Ответы (3)


Процесс может устанавливать лимиты ресурсов только для себя и своих потомков. Он не может устанавливать ограничения ресурсов для своего предка. Вызывая os.system('ulimit -c'), вы просите дочерний процесс "ulimit" установить лимит ресурсов родительского процесса "Python".

Ваша программа Python может установить лимит ресурсов с помощью модуля resource:

import resource

resource.setrlimit(
    resource.RLIMIT_CORE,
    (resource.RLIM_INFINITY, resource.RLIM_INFINITY))
person Robᵩ    schedule 24.08.2014
comment
Фантастика, спасибо! Я не знал о ресурсном модуле. Проверено и работает отлично :) Теперь ждем дампов ядра. - person Jono; 25.08.2014

Чтобы добавить еще одно решение, я глобально установил ulimit в debian с помощью limit.conf:

grep -q -F '* soft core 100000' /etc/security/limits.conf || echo '* soft core 100000' >> /etc/security/limits.conf
grep -q -F 'root hard core 100000' /etc/security/limits.conf || echo 'root hard core 100000' >> /etc/security/limits.conf

Это также было возможно с помощью команды os.system в python.

person Jono    schedule 29.08.2014
comment
Обратите внимание, что изменения в limits.conf вступают в силу в начале вашего следующего сеанса входа. - person Robᵩ; 29.08.2014

Я предполагаю, что ваша проблема в том, что вы не поняли, что rlimit устанавливаются для каждого процесса. Если вы используете os.system в Python для вызова ulimit, это только установит ulimit в этом недавно порожденном процессе оболочки, который затем немедленно завершится, после чего ничего не изменилось.

Вместо этого вам нужно запустить ulimit в оболочке, которая запускает вашу программу. Затем процесс, в котором выполняется ваша программа, унаследует этот rlimit от оболочки.

Я не думаю, что есть какой-либо способ изменить rlimit процесса X от процесса Y, где X != Y.

РЕДАКТИРОВАТЬ: мне придется забрать последнее, по крайней мере, в случае, если вы работаете в Linux. Существует специфичный для Linux системный вызов prlimit, который позволяет вам изменять rlimits другого процесса, и он также доступен в модуле Python resource, хотя там он не задокументирован. Вместо этого см. справочную страницу prlimit(2); Я бы предположил, что функция, доступная в Python, использует те же аргументы.

person Dolda2000    schedule 24.08.2014