Как увеличить максимальный предел FD для процесса-демона, работающего под руководством пользователя?

Чтобы увеличить лимит FD для процесса-демона, работающего под безголовым пользователем на машине с Ubuntu Linux, мы сделали следующие изменения в /etc/security/limits.conf

soft nofile 10000
hard nofile 10000

Мы также добавили требуемый сеанс pam_limits.so в /etc/pam.d/login. Изменения были отражены для всех пользователей, которые вышли из системы и снова вошли в систему. Все новые процессы, запускаемые этими пользователями, получают новые ограничения FD.

Но для демона, который работает под безголовым пользователем, изменения не отражаются. Каким образом можно отразить изменения для демона, работающего под безголовым пользователем?

4 ответа

Вы можете прочитать / установить ограничения ресурсов запущенного процесса с помощью prlimit(1), части util-linux:

sudo prlimit --pid PID --nofile 8192:16384

Проблема была в запуске скрипта демона. Он использовал setuidgid для запуска демона под безголовым пользователем. Похоже, что setuidgid не устанавливает ограничения ресурсов, которые установлены в limit.conf, при изменении пользователя / группы для процесса. Демон должен позаботиться об установлении лимитов ресурсов для себя через свои сценарии запуска. Установив максимальные ограничения FD для текущего сеанса в скрипте запуска, новые ограничения были отражены для демона. Это было сделано путем вставки строки ulimit -n, как показано ниже в скрипте запуска демона.

ulimit -n $NEW_MAX_LIMIT
exec setuidgid userxyz /pat/to/daemon.sh

Перезагрузка определенно позаботится об этом. Но я полагаю, вы хотите избежать этого. (а кто нет?)

Таким образом, вам нужно HUP процесс инициализации. Он почти всегда работает на PID 1, но вы можете дважды проверить свою систему. Это не совсем безопасная вещь, но она может избежать перезагрузки. Поэтому, пожалуйста, попробуйте сначала на тестовой коробке:

kill -HUP 1

Вы можете установить пределы запущенного процесса, используя procfs.

Найдите идентификатор процесса, который вы хотите изменить (в данном случае 1234), затем выполните:

pid=1234        # This is the process ID, found with `ps`.
h_nofile=16384  # hard limit of "Max open files"
s_nofile=8192   # soft limit of "Max open files"
grep "Max open files" /proc/$pid/limits
echo -n "Max open files=$s_nofile:$h_nofile" > /proc/$pid/limits
grep "Max open files" /proc/$pid/limits

Этот метод больше не поддерживается недавним ядром. Альтернатива заключается в использовании prlimit как упоминал @nous.

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