2

Я пытаюсь запустить Solr в качестве службы SystemD. Когда я запускаю сервис, я получаю это предупреждение, тогда сервер solr останавливается.

jun 22 16:20:07 solr_start[1488]: *** [WARN] ***  Your Max Processes Limit is currently 14972.
jun 22 16:20:07 solr_start[1488]: It should be set to 65000 to avoid operational disruption.
jun 22 16:20:07 solr_start[1488]: If you no longer wish to see this warning, set SOLR_ULIMIT_CHECKS to false in your profile or solr.in.sh
jun 22 16:20:09 solr_start[1488]: Warning: Available entropy is low. As a result, use of the UUIDField, SSL, or any other features that require
jun 22 16:20:09 solr_start[1488]: RNG might not work properly. To check for the amount of available entropy, use 'cat /proc/sys/kernel/random/entropy_avail'.
jun 22 16:20:14 solr_start[1488]: [146B blob data]
jun 22 16:20:14 solr_start[1488]: Started Solr server on port 8983 (pid=1579). Happy searching!
jun 22 16:20:15 solr_stop[1680]: Sending stop command to Solr running on port 8983 ... waiting up to 180 seconds to allow Jetty process 1579 to stop gracefully.

Я проверил код по адресу https://github.com/apache/lucene-solr/blob/master/solr/bin/solr#L1509. Я вижу, что solr выполняет проверку ulimit -u и ulimit -n.

Странно то, что я убедился, что SystemD запустит сервер solr с пользователем "solr".

[Unit]
Description=Apache SOLR
After=syslog.target network.target remote-fs.target nss-lookup.target systemd-journald-dev-log.socket
Before=multi-user.target
[Service]
User=solr
#PIDFile=/mnt/solrdata/solr-8983.pid
Environment=SOLR_INCLUDE=/opt/solr/bin/solr.in.sh
ExecStart=/opt/solr/bin/solr_start
ExecStop=/opt/solr/bin/solr_stop
#Restart=on-failure
[Install]
WantedBy=multi-user.target​

И этот пользователь "solr" (который я настроил специально для запуска сервера Solr) может создавать неограниченное количество процессов и открывать неограниченное количество файлов.

[solr@xxx ~]# ulimit -n
unlimited
[root@xxx ~]# ulimit -u
unlimited

Когда SystemD запускает solr, я вижу, что он использует правильного пользователя (пользователя "solr", которого я настроил). Все же я вижу ошибку выше.

Когда я запускаю solr напрямую с пользователем "solr" (нет с SystemD), это работает.

Почему пользовательские ограничения применяются во время выполнения, когда я сам запускаю сервер Solr, отличные от тех, которые используются при запуске SystemD ???

1 ответ1

3

Правильный способ настроить ограничения для сервисов - сделать это в самом файле .service unit. Используйте параметры LimitNOFILE= и аналогичные.

[Service]
LimitNOFILE=infinity
LimitNPROC=infinity

"Учетные записи пользователей" - это несколько нечеткая концепция в Linux. Полный интерактивный процесс входа в систему состоит из нескольких независимых шагов - установка переменных среды, открытие сеанса PAM, изменение UID/GID, запуск оболочки в режиме входа в систему и запуск ее /etc /profile ...

Большинство из этих шагов не относятся к услугам. Запуск службы не является "логином" в Linux, например, PAM не вызывается. Когда вы указываете параметр User = в конфигурации службы (будь то в systemd или в собственной конфигурации демона), он делает только одно: измените UID/GID на тот, который вы указали.

Это означает, что любые ограничения из /etc/security/limits.conf не будут применяться (потому что для этого потребуется PAM), а любые команды из /etc/profile не будут выполняться (для этого потребуется оболочка).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .