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

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

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

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

3 ответа

Решение

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

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

import resource

resource.setrlimit(
    resource.RLIMIT_CORE,
    (resource.RLIM_INFINITY, resource.RLIM_INFINITY))

Чтобы добавить другое решение - я глобально установил 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 команда в питоне.

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

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

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

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

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