Java-процесс преждевременно перезапускается под runit

Я пытаюсь запустить Logstash под контролем runit. Мой скрипт запуска для Logstash просто

#!/bin/sh
SSL_CERT_DIR=/etc/ssl/certs exec /usr/bin/java -jar /usr/local/bin/logstash.jar agent -f /tmp/logstash.conf --log /var/log/logstash.log

Если я запускаю этот скрипт вручную, потребуется 30 или 45 секунд, чтобы процесс правильно запустился и начал выполнять работу, но впоследствии он будет работать в течение пары часов. Тем не менее, когда я пытаюсь сделать sv start logstash он выполняет сценарий (и Logstash определенно запускается, потому что я вижу вывод, записанный в /var/log/logstash.log), но через 15 или 20 секунд runit, похоже, убивает и перезапускает процесс Java Logstash.

Я пытался установить -w вариант, но, похоже, он больше не ждет запуска процесса.

Как я могу правильно запустить runit, чтобы запустить этот процесс Java и перезапустить его только после его смерти?

2 ответа

Решение

Это оказалось не проблемой с runit, а с logstash. Тем не менее, я не вижу ошибки, потому что я не ловил вывод из сценария запуска. Изменение команды до конца

2>&1 >> /var/log/logstash_runner.log

Записывает stderr и stdout в файл. Это позволило мне обнаружить настоящую проблему в том, что мне нужно было установить HOME в моем скрипте, чтобы logstash мог найти HOME/.netrc для аутентификации с помощью плагина Heroku.

Сначала установите svlog, Используя это довольно безболезненно.

Во-вторых, (при условии, что определение службы находится в /etc/sv) измените /etc/sv/logstash/run сказать:

#!/bin/sh
exec 2&>1
SSL_CERT_DIR=/etc/ssl/certs exec /usr/bin/java -jar /usr/local/bin/logstash.jar agent -f /tmp/logstash.conf --log /var/log/logstash.log

Вы правы в этом stderr должен быть перенаправлен на stdout,

Затем сделайте это (адаптируясь к вашей установке по мере необходимости):

mkdir /etc/sv/logstash/log
touch /etc/sv/logstash/log/run
chmod 744 /etc/sv/logstash/log/run
mkdir /var/log/logstash
chown log /var/log/logstash
chmod 775 /var/log/logstash
ln -s /var/log/logstash /etc/sv/logstash/log/main

Это создает запись журнала для службы, устанавливает файл-заглушку для редактирования, создает каталог для хранения файлов журнала и предоставляет символическую ссылку для службы регистрации, на которую следует перенаправлять вывод.

Наконец, поместите это в /etc/sv/logstash/log/run

#!/bin/sh
exec 2>&1
exec svlog -tt main

Перезапустите сервис с помощью sv restart logstash и подождите несколько секунд... и у вас должно быть два процесса в списке, ваш logstash обслуживание и svlog работает с этим. Все выход из logstash будет подаваться в svlogкоторый, в свою очередь, запишет файл журнала в /etc/sv/logstash/log/main символическая ссылка, которая в свою очередь падает в /var/log/logstash/current, Завершение logstash обслуживание с sv stop logstash позволит любой окончательный вывод в svlog который будет записывать на диск перед выходом.

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