Чтобы увеличить лимит FD для процесса-демона, запущенного под пользователем без головы на машине с Ubuntu Linux, мы внесли следующие изменения в /etc/security/limits.conf
soft nofile 10000
hard nofile 10000
Мы также добавили требуемый сеанс pam_limits.so в /etc/pam.d/login. Изменения отразились на всех пользователях, которые вышли из системы и снова вошли в систему. Какие бы новые процессы ни запускались под этими пользователями, они получают новые лимиты FD.
Но для демона, работающего под управлением пользователя без головы, изменения не отражаются. как можно отразить изменения для демона, работающего под управлением пользователя без головы?
Вы можете прочитать / установить ограничения ресурсов для запущенного процесса с помощью prlimit (1), части util-linux:
sudo prlimit --pid PID --nofile 8192:16384
Проблема была в скрипте запуска демона. Он использовал setuidgid для запуска демона от имени пользователя без головы. Похоже, setuidgid не будет устанавливать ограничения ресурсов, которые установлены в limits.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.