Установить `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
команда в питоне.
Я предполагаю, что ваша проблема в том, что вы этого не поняли rlimit
s установлены для процесса. Если вы используете os.system
в Python вызывать ulimit, который только собирается установить ulimit в этом новом порожденном процессе оболочки, который сразу же завершается, после чего ничего не изменилось.
Вместо этого вам нужно запустить ulimit
в оболочке, которая запускает вашу программу. Процесс, в котором выполняется ваша программа, затем унаследует этот rlimit от оболочки.
Я не думаю, что есть какой-либо способ изменить ограничение процесса X от процесса Y, где X!= Y.
РЕДАКТИРОВАТЬ: Я должен взять это последнее обратно, по крайней мере, если вы работаете в Linux. Существует специфичный для Linux системный вызов prlimit
это позволяет вам изменять rlimits другого процесса, и это также, кажется, доступно в Python resource
модуль, хотя там нет документов. Смотрите справочную страницу prlimit(2)
вместо; Я бы предположил, что функция, доступная в Python, использует те же аргументы.