Я пытаюсь запустить 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.