Назад | Перейти на главную страницу

Преждевременный перезапуск процесса 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 секунд он, кажется, убивает и перезапускает процесс Java Logstash.

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

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

Сначала установите 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 который будет записывать на диск перед выходом.

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

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

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